1. 程式人生 > >基於ROS使用Arduino控制數碼管

基於ROS使用Arduino控制數碼管

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

來張圖片: