目录
使用老师提供的网站:AUTUDESK
在该网站注册账号即可免费使用,可以最低限度满足本次项目要求
使用说明
电路模拟
点击创建新电路 
选择相应组件组合即可
3D建模
点击创建新设计
选择合适的3D组件组合即可
使用Arduino官网的IDE选择对应版本下载即可
Tips
在AUTUDESK模拟电路时,可以将代码导入,测试代码的正确性
基于Arduion电路板使用不同语言的函数的参考文献
对于该项目,我们只需掌握Digital I/O相关的函数即可
Arduino采用USART通信模式,可以有硬串口,软串口两种实现方式。
通常将Arduino UNO上自带的串口0(RX)、1(TX)称为硬件串口,可与外围串口设备通信。而使用SoftwareSerial类库模拟成的串口,称为软件模拟串口(简称软串口)。如果要连接更多的串口设备,可以使用软串口。
1、初始化程序
setup()函数中的代码只会被运行一次,通常用来做一下初始化工作;
2、循环主程序
loop()函数中的代码会被无限次地重复运行,程序的主体部分会写在这里;
描述:开启串口,通常置于setup()函数中。
原型:
参数:
返回值:无。
描述:串口输出数据,写入字符数据到串口。
原型:
参数:
val:打印的值,任意数据类型。
config:输出的数据格式。BIN(二进制)、OCT(八进制)、DEC(十进制)、HEX(十六进制)。对于浮点数,此参数指定要使用的小数位数。
示例:
Serial.print(78, BIN) 得到 “1001110”
Serial.print(78, OCT) 得到 “116”
Serial.print(78, DEC) 得到 “78”
Serial.print(78, HEX) 得到 “4E”
Serial.print(1.23456, 0) 得到 “1”
Serial.print(1.23456, 2) 得到 “1.23”
Serial.print(1.23456, 4) 得到 “1.2346”
Serial.print(‘N’) 得到 “N”
Serial.print(“Hello world.”) 得到 “Hello world.”
返回值:返回写入的字节数。
Serial.println()可以实现换行输出
描述:判断串口缓冲区的状态,返回从串口缓冲区读取的字节数。
原型:Serial.available()
参数:无。
返回值:可读取的字节数。
描述:读取串口数据,一次读一个字符,读完后删除已读数据。
原型:Serial.read()
参数:无。
返回值:返回串口缓存中第一个可读字节,当没有可读数据时返回-1,整数类型。
描述:从指定的数字引脚读取值,无论是HIGH还是LOW。
原型:digitalRead(pin)
参数:pin:读取的 Arduino 引脚号
返回值:HIGH或者LOW
示例:
将引脚 13 设置为与引脚 7 相同的值,声明为输入。
int ledPin = 13; // LED connected to digital pin 13
int inPin = 7; // pushbutton connected to digital pin 7
int val = 0; // variable to store the read value
void setup() {
pinMode(ledPin, OUTPUT); // sets the digital pin 13 as output
pinMode(inPin, INPUT); // sets the digital pin 7 as input
}
void loop() {
val = digitalRead(inPin); // read the input pin
digitalWrite(ledPin, val); // sets the LED to the button's value
}
描述:
将一个HIGH或一个LOW值写入数字引脚。
如果引脚已配置为OUTPUTwith pinMode(),则其电压将设置为相应的值: 5V(或 3.3V 板上的 3.3V)为HIGH, 0V(接地)为LOW。
如果引脚配置为INPUT,digitalWrite()将启用 ( HIGH) 或禁用 ( LOW) 输入引脚上的内部上拉电阻。建议将 设置pinMode()为INPUT_PULLUP启用内部上拉电阻,参考数字引脚教程。
如果不设置pinMode(),OUTPUT将 LED 连接到引脚,调用 时digitalWrite(HIGH),LED 可能会显得暗淡。没有明确设置pinMode(),digitalWrite()将启用内部上拉电阻,其作用类似于一个大限流电阻。
原型:digitalWrite(pin, value)
参数:
pin:Arduino 引脚号。
value:HIGH或LOW.
返回值:无
示例:
//该代码使数字引脚 13 an并通过在和之间以一秒的速度OUTPUT交替来切换它。
void setup() {
pinMode(13, OUTPUT); // sets the digital pin 13 as output
}
void loop() {
digitalWrite(13, HIGH); // sets the digital pin 13 on
delay(1000); // waits for a second
digitalWrite(13, LOW); // sets the digital pin 13 off
delay(1000); // waits for a second
}
描述:
将指定的引脚配置为输入或输出。有关引脚功能的详细信息,参考数字引脚页面。
从 Arduino 1.0.1 开始,可以使用 mode 启用内部上拉电阻INPUT_PULLUP。此外,该INPUT模式明确禁用内部上拉。
原型:pinMode(pin, mode)
参数
pin:要设置模式的 Arduino 引脚号。
mode: INPUT,OUTPUT或INPUT_PULLUP. 参考数字引脚页面。
返回值:无
示例:
//该代码使数字引脚 13OUTPUT和切换它HIGH和LOW
void setup() {
pinMode(13, OUTPUT); // sets the digital pin 13 as output
}
void loop() {
digitalWrite(13, HIGH); // sets the digital pin 13 on
delay(1000); // waits for a second
digitalWrite(13, LOW); // sets the digital pin 13 off
delay(1000); // waits for a second
}
首先,需要在模拟环境中添加一块Arduino电路板
其次,需要四个直流电机,用于实现行进及转向控制功能
可以先在IDE环境中编译,之后导入虚拟环境中模拟
(1). 前进、后退及停止功能
实现该功能,需要控制引脚输出的信号,使得两个引脚在直流电机的接口产生电位差,且要保证四个电机的电位差相等,使得小车可以沿着统一方向行驶,当不存在电位差时,电机停止运作,实现停止功能。
前进代码的实现:
void car_go(){
digitalWrite(p1,HIGH);
digitalWrite(p2,LOW);
digitalWrite(p3,HIGH);
digitalWrite(p4,LOW);
}
执行后的结果
可以看到四个电机均向正方向转动
后退代码的实现
void car_back(){
digitalWrite(p1,LOW);
digitalWrite(p2,HIGH);
digitalWrite(p3,LOW);
digitalWrite(p4,HIGH);
}
执行后的结果
可以看到四个电机均向反方向转动
停止代码的实现
void car_stop(){
digitalWrite(p1,LOW);
digitalWrite(p2,LOW);
digitalWrite(p3,LOW);
digitalWrite(p4,LOW);
}
执行后的结果
可以看到四个电机均停止转动
(2). 转向功能
实现小车转向功能,可以控制两侧电机运作方向相反,同侧电机运作方向同步,通过改变引脚的输出信号,可以实现该功能。
小车左转向代码的实现
void car_left(){
digitalWrite(p1,LOW);
digitalWrite(p2,HIGH);
digitalWrite(p3,HIGH);
digitalWrite(p4,LOW);
}
执行后的结果
可以看到上方同侧电机正向转动,下方同侧电机反向转动
小车右转向代码的实现
void car_right(){
digitalWrite(p1,HIGH);
digitalWrite(p2,LOW);
digitalWrite(p3,LOW);
digitalWrite(p4,HIGH);
}
执行后的结果
可以看到上方同侧电机反向转动,下方同侧电机正向转动
(3). HC-06蓝牙模块链接功能
对Arduino链接HC-06蓝牙模块后,在启动时需要对串口进行链接
链接图

代码调试
#include <SoftwareSerial.h>
SoftwareSerial BT(8, 9); //新建对象,接收脚为8,发送脚为9
char val1; //存储接收的变量
void setup() {
Serial.begin(9600); //与电脑的串口连接
Serial.println("BT is ready!");
BT.begin(9600); //设置蓝牙模块波特率
}
void loop() {
//如果串口接收到数据,就输出到蓝牙串口
if (Serial.available()) {
val 1= Serial.read();
BT.print(val1);
}
//如果接收到蓝牙模块的数据,输出到屏幕
if (BT.available()) {
val1 = BT.read();
Serial.print(val1);
}
}
(4). 蓝牙模块数据处理功能
当通过蓝牙向小车板载的HC-06蓝牙模块发出信号时,小车需要对接收到的蓝牙信号进行处理,以实现对小车的控制
小车蓝牙信息处理代码的实现
if(Serial.available()>0){ //当接收信号的返回值大于0时说明接收到了信号
char val=Serial.read(); //读入接收的信号值
if(val=='f'){ //当信号为’f’时,执行前进的代码
car_go();
}
else if(val=='b'){ //当信号为’b’时,执行后退的代码
car_back();
}
else if(val=='l'){ //当信号为’l’时,执行左转的代码
car_left();
}
else if(val=='r'){ //当信号为’r’时,执行右转的代码
car_right();
}
else{ //当信号非法时,执行停止的代码
car_stop();
}
}
根据个人风格的不同,选择内置库中自己喜欢的模型组合即可,以下是我的建模成品图
主视图
左视图
俯视图
推荐看我好基友的这篇优质详解大一专业认知实习



如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD