Arduino スレーブその1: 1桁7セグ

今回はArduino pro miniを使ってみた。

AliExpressで探してみると互換機をUS$18.49/10個で売っていたので注文してみた。ちゃんと届くのかなぁと思い待っていると、2週間後ぐらいに届いたので開封してみる。基盤とピンヘッダがそれぞれ個包装されていてきちんと梱包されていると感心しつつ数を数えてみると、あら不思議。基盤が11個・ピンヘッダが9個分。なかなか笑わせてくれたのでありとしよう。(しかもちょっとお得?)

Arduinoが1個¥200程度で手に入るとなると、贅沢な使い方ができそうだ。今回はその第一弾として、シリアル通信でスレーブとして動く1桁7セグLEDを作ってみた。

材料

・Arduino pro mini 328 5V
・7セグLED
・抵抗330Ω

回路

7セグ

ソースコード


// pin definition for the Uno
#define P_a 6
#define P_b 7
#define P_c 13
#define P_d 10
#define P_e 11
#define P_f 9
#define P_g 8
#define P_dp 12

char charA_out[80];

void setup() {
  Serial.begin(9600); 
  pinMode(BUZZER,OUTPUT);
  pinMode(P_a,OUTPUT);
  pinMode(P_b,OUTPUT);
  pinMode(P_c,OUTPUT);
  pinMode(P_d,OUTPUT);
  pinMode(P_e,OUTPUT);
  pinMode(P_f,OUTPUT);
  pinMode(P_g,OUTPUT);
  pinMode(P_dp,OUTPUT);
}

void loop() {
  
  if(myReadLine(charA_out) > 0){
    seg_num(atoi(charA_out));    
  }
  
}

int myReadLine(char charA[]){
  int cnt_buf = 0;
  
  //受信したら
  if(Serial.available() > 0){
    delay(100);
    cnt_buf = max(79,Serial.available());  //受信文字数 最大79文字
    for (int iii = 0; iii < cnt_buf; iii++){
      charA[iii] = Serial.read();
    }
    charA[cnt_buf] = '\0';  //終端文字
  }
  return cnt_buf;
}


void seg_num(int num){
  //7セグに数字を出力
  byte out_seg;
  switch (num){
    case 0:
      out_seg = B11111100;
      break;
    case 1:
      out_seg = B01100000;
      break;
    case 2:
      out_seg = B11011010;
      break;
    case 3:
      out_seg = B11110010;
      break;
    case 4:
      out_seg = B01100110;
      break;
    case 5:
      out_seg = B10110110;
      break;
    case 6:
      out_seg = B10111110;
      break;
    case 7:
      out_seg = B11100000;
      break;
    case 8:
      out_seg = B11111110;
      break;
    case 9:
      out_seg = B11110110;
      break;
    default:
      out_seg = B00000000;
  }
  seg_disp(out_seg);
}


void seg_disp(byte out){
  digitalWrite(P_a,bitRead(out,7));
  digitalWrite(P_b,bitRead(out,6));
  digitalWrite(P_c,bitRead(out,5));
  digitalWrite(P_d,bitRead(out,4));
  digitalWrite(P_e,bitRead(out,3));
  digitalWrite(P_f,bitRead(out,2));
  digitalWrite(P_g,bitRead(out,1));
  digitalWrite(P_dp,bitRead(out,0));
}

動作確認

シリアル通信で数字を送信すると7セグLEDに表示される。

IMG_2014121844329

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です