基於ROS使用Arduino控制四位數碼管
阿新 • • 發佈:2018-11-01
1. 硬體
Arduino控制板:1個;
數碼管:1個;
杜邦線:若干;
1.1 接線方式
參考如下:
a = 1; tb = 2; c = 3;d = 4; e = 5; f = 6; g = 7; dp = 8;
注意:上面的這些都需要串聯電阻。
//設定陽極介面
d4 = 9; d3 = 10; d2 = 11; d1 = 12;
注意:這些可以直接連線到Arduino上。
來張實際的照片(略麻煩):
2 程式
#include <ros.h> #include <std_msgs/Empty.h> int a = 13; int b = 2; int c = 3; int d = 4; int e = 5; int f = 6; int g = 7; int dp = 8; //設定陽極介面 int d4 = 9; int d3 = 10; int d2 = 11; int d1 = 12; /////////////////////////////////////////////////////////////// void WeiXuan(unsigned char n)// { switch(n) { case 1: digitalWrite(d1,HIGH); digitalWrite(d2, LOW); digitalWrite(d3, LOW); digitalWrite(d4, LOW); break; case 2: digitalWrite(d1, LOW); digitalWrite(d2, HIGH); digitalWrite(d3, LOW); digitalWrite(d4, LOW); break; case 3: digitalWrite(d1,LOW); digitalWrite(d2, LOW); digitalWrite(d3, HIGH); digitalWrite(d4, LOW); break; case 4: digitalWrite(d1, LOW); digitalWrite(d2, LOW); digitalWrite(d3, LOW); digitalWrite(d4, HIGH); break; default : digitalWrite(d1, LOW); digitalWrite(d2, LOW); digitalWrite(d3, LOW); digitalWrite(d4, LOW); break; } } void Num_0() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); digitalWrite(dp,HIGH); } void Num_1() { digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(dp,HIGH); } void Num_2() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, LOW); digitalWrite(dp,HIGH); } void Num_3() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); digitalWrite(dp,HIGH); } void Num_4() { digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); digitalWrite(dp,HIGH); } void Num_5() { digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); digitalWrite(dp,HIGH); } void Num_6() { digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); digitalWrite(dp,HIGH); } void Num_7() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(dp,HIGH); } void Num_8() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); digitalWrite(dp,HIGH); } void Num_9() { digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, LOW); digitalWrite(dp,HIGH); } void Clear() //清屏 { digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(dp,HIGH); } void pickNumber(unsigned char n)//選數 { switch(n) { case 0:Num_0(); break; case 1:Num_1(); break; case 2:Num_2(); break; case 3:Num_3(); break; case 4:Num_4(); break; case 5:Num_5(); break; case 6:Num_6(); break; case 7:Num_7(); break; case 8:Num_8(); break; case 9:Num_9(); break; default:Clear(); break; } } void Display(unsigned char x, unsigned char Number)//顯示x為座標,Number為數字 { WeiXuan(x); pickNumber(Number); delay(500); //時間不能太長,要不ROS系統不穩定。 Clear(); } void messageCb(std_msgs::Empty &message) { Display(1,1); Display(2,2); Display(3,3); Display(4,4); } ros::NodeHandle nh; ros::Subscriber<std_msgs::Empty> sub("chatter",&messageCb); void setup(){ nh.initNode(); nh.subscribe(sub); pinMode(d1, OUTPUT); pinMode(d2, OUTPUT); pinMode(d3, OUTPUT); pinMode(d4, OUTPUT); pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode(dp, OUTPUT); } void loop(){ nh.spinOnce(); delay(1000); }
2.1 程式下載和執行
首先:roscore
其次:rosrun rosserial_python serial_node.py /dev/ttyACM0
/dev/ttyACM0 這個是自己的埠號
最後:rostopic pub -1 /buzzer_msgs/Int8 1
來張圖片: