在前面的内容中,本书介绍了各个模块,在这里要把这几个模块结合起来做一个整体测试,此时可以通过无线蓝牙键盘模块输入数字区键1~9来进行功能测试,标配的控制器中无线键盘鼠标是一体的(见图7.4.4),由具有USB接口的接收器接收。
图7.4.3机器人整体电路设计
图7.4.4 无线键盘鼠标
图7.4.5 在嵌入式控制板中测试传感器的界面
底层控制板的程序如下:
#include 〈Wire.h〉
#include 〈Software Serial.h〉
Software Serial my Serial(2, 3); // RX, TX
const int ping Tig = 15;//PC1
cons tint ping Eco = 14;//PC0
cons int flag = 0;
#define SLAVE_ADDRESS 0x04
int number = 0;
int state = 0;
Char addr[4];
long duration, inches, cm;
int INA = 4; //电机 A 正反转控制端
int PWMA = 5; //电机 A 调速端
int INB = 7; //电机 B 正反转控制端
int PWMB = 6; //电机 B 调速端
void motospd(int sp1,int sp2) //电机速度控制函数,括号内分别为左右电机速度值,{ //范围-255~+255,正值为正转,负值为反转。
if(sp1〉0)
digital Write(INA, HIGH);
else
digital Write(INA, LOW);
if(sp2〉0)
digital Write(INB, HIGH);
else
digital Write(INB, LOW);
analog Write(PWMA,abs (sp1));
analog Write(PWMB,abs (sp2));
}
}
void setup() {
pin Mode(INA,OUTPUT);
pin Mode(INB,OUTPUT);//配置电机驱动 IO 口为输出
pin Mode(ping Tig, OUTPUT);
pin Mode(ping PEco, INPUT);
Serial.begin(9600); //start serial for output
my Serial.begin(9600);
// initialize i2c as slave
Wire.begin(SLAVE_ADDRESS);
// define callbacks for i2c communication
Wire.on Receive(receive Data);
Wire.on Request(send Data);
Serial.println("Ready!");
}
void loop(){
delay(100);
}
long microseconds To Inches(long microseconds)
{
return microseconds / 74 / 2;
}
long microseconds To Centimeters(long microseconds)
{
return microseconds / 29 / 2;
}
// callback for received data
void receive Data(int byte Count){
while(Wire.available()) {
number = Wire.read();
Serial.print("data received: ");
Serial.println(number);
if (number == 1){
long duration, inches, cm;
digital Write(ping Tig, LOW);
delay Microseconds(2);
digital Write(ping Tig, HIGH);
delay Microseconds(5);
digital Write(ping Tig, LOW);
duration = pulse In(ping Eco, HIGH);
inches = microseconds To Inches(duration);
cm = microseconds To Centimeters(duration);
Wire.write(cm);
}
else if(number==2)
{
Wire.write(sensor Pin);
}
esle if(number ==3)
{
motospd(100,100); //直行
Wire.write(0x01);
}
}
}
// callback for sending data
void send Data(){
Wire.write(flag);//为零时,上位机不处理,为1时上位机处理
}
嵌入式控制板的程序如下:
import smbus
import time
# for RPI version 1, use "bus = smbus.SMBus(0)"
bus = smbus.SMBus(1)
# This is the address we setup in the Arduino Program
address = 0x04
def write Number(value):
bus.write_byte(address, value)
# bus.write_byte_data(address, 0, value)
return -1
def read Number():
number = bus.read_byte(address)
# number = bus.read_byte_data(address, 1)
return number
while True:
var = input("Enter 1 - 9: ")
if not var:
continue
write Number(var)
print "RPI: Hi Arduino, I sent you ", var
# sleep one second
time.sleep(1)
number = read Number()
print "Arduino: Hey RPI, I received a digit ", number
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。