基於ROS使用Arduino控制數碼管
阿新 • • 發佈:2018-11-01
1. 硬體
Arduino控制板:1個;
數碼管:1個;
杜邦線:若干;
1.1 接線方式
參考如下方式:
實物連線圖:
注意:數碼管有兩種接法,共陰數碼管在應用時應將公共極接到GND或者5V。
來張實際的照片(略麻煩):
2 程式
#include <ros.h> #include <std_msgs/Int16.h> //設定控制各段的數字IO 腳 int a=7;//定義數字介面7 連線a 段數碼管 int b=6;// 定義數字介面6 連線b 段數碼管 int c=5;// 定義數字介面5 連線c 段數碼管 int d=10;// 定義數字介面10 連線d 段數碼管 int e=11;// 定義數字介面11 連線e 段數碼管 int f=8;// 定義數字介面8 連線f 段數碼管 int g=9;// 定義數字介面9 連線g 段數碼管 int dp=4;// 定義數字介面4 連線dp 段數碼管 void digital_0(void) //顯示數字5 { unsigned char j; 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 digital_1(void) //顯示數字1 { unsigned char j; digitalWrite(c,LOW);//給數字介面5 引腳高電平,點亮c 段 digitalWrite(b,LOW);//點亮b 段 for(j=7;j<=11;j++)//熄滅其餘段 digitalWrite(j,HIGH); digitalWrite(dp,HIGH);//熄滅小數點DP 段 } void digital_2(void) //顯示數字2 { unsigned char j; digitalWrite(b,LOW); digitalWrite(a,LOW); for(j=9;j<=11;j++) digitalWrite(j,LOW); digitalWrite(dp,HIGH); digitalWrite(c,HIGH); digitalWrite(f,HIGH); } void digital_3(void) //顯示數字3 { digitalWrite(g,LOW); digitalWrite(a,LOW); digitalWrite(b,LOW); digitalWrite(c,LOW); digitalWrite(d,LOW); digitalWrite(dp,HIGH); digitalWrite(f,HIGH); digitalWrite(e,HIGH); } void digital_4(void) //顯示數字4 { digitalWrite(c,LOW); digitalWrite(b,LOW); digitalWrite(f,LOW); digitalWrite(g,LOW); digitalWrite(dp,HIGH); digitalWrite(a,HIGH); digitalWrite(e,HIGH); digitalWrite(d,HIGH); } void digital_5(void) //顯示數字5 { unsigned char j; 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 digital_6(void) //顯示數字6 { unsigned char j; for(j=7;j<=11;j++) digitalWrite(j,LOW); digitalWrite(c,LOW); digitalWrite(dp,HIGH); digitalWrite(b,HIGH); } void digital_7(void) //顯示數字7 { unsigned char j; for(j=5;j<=7;j++) digitalWrite(j,LOW); digitalWrite(dp,HIGH); for(j=8;j<=11;j++) digitalWrite(j,HIGH); } void digital_8(void) //顯示數字8 { unsigned char j; for(j=5;j<=11;j++) digitalWrite(j,LOW); digitalWrite(dp,HIGH); } void digital_9(void) //顯示數字5 { unsigned char j; 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 messageCb(std_msgs::Int16 message) { int temp_message = message.data; switch(temp_message) { case 0: digital_0(); break; case 1: digital_1(); break; case 3: digital_3(); break; case 4: digital_4(); break; case 5: digital_5(); break; case 6: digital_6(); break; case 7: digital_7(); break; case 8: digital_8(); break; case 9: digital_9(); break; case 2: digital_2(); break; } } ros::NodeHandle nh; ros::Subscriber<std_msgs::Int16> sub("chatter",&messageCb); void setup(){ nh.initNode(); nh.subscribe(sub); int i;//定義變數 for(i=4;i<=11;i++) pinMode(i,OUTPUT);//設定4~11 引腳為輸出模式 } void loop(){ nh.spinOnce(); }
2.1 程式下載和執行
首先:roscore
其次:rosrun rosserial_python serial_node.py /dev/ttyACM0
/dev/ttyACM0 這個是自己的埠號
最後:rostopic pub -1 /buzzer_msgs/Int8 1
來張圖片: