#010【49歳から始めるArudino -黒帯を目指せ】 白帯編4 シリアル通信

 教科書のp42です。ここでは新しいことがいくつか出てきます。そして私は思わずハマりそうになってしまいました(時間を必要以上に使ってしまうこと)。まずは深追いはせずに、色々と試して、次の段階に進むのがいいと思います。いや、やっぱり深く行きたいという人は、一緒に学習して行きましょう。ここは第一の関門と言って良いでしょう。

 ここでの課題はシリアル通信を利用してoもしくはpの入力によりLEDを点灯消灯させること、さらにbの入力時にはLEDが10回点滅するというスケッチです。シリアル通信とは「言葉でおしゃべりをしてくれる」ということです。どうやらこれができると、こちらかの入力を理解したり、また相手のことをより簡単に理解して液晶とかに表示させたり、別の機器やPCとつなぐことができます。そして私が重宝しているのは、スケッチの怪しいところに入れて、スケッチがどこまでちゃんと動いていかを見極めるために、喋ってもらっています。例えばLED点灯するはずなのに、しない場合は、LED点灯を命令している直前に「LED点灯!」みたいな独り言を喋ってもらいます。そうやって、どこでスケッチが壊れているかを見極める判断ができます。

 ここで利用するコマンドは以下の通りで、太字については理解を深めるために、さらに調べて見ました。教科書で学習が済んだら、スケッチは自分で最初から書いてみるのは、良い学習方法です。教科書の見ずに書く練習をするときには、参考としてこのコマンドリストを利用するといいでしょう。個人的にはif文が最初に出てくるのかと思いましたが、switchをここでは利用しています。いつか高橋先生に教えてもらおうかと思います。
  • #define
  • void setup()
  • void loop()
  • pinMode()
  • Serial.begin()
  • int inputchar;
  • switch()
  • inputchar
  • Serial.read()
  • case
  • Serial.print()
  • digitalWrite
  • "LED ON\n"
  • break;
ヒント:
 int inputchar; intはデーターのタイプを示します。そのあとに続くinputcharは代名詞で、inputcharのデータータイプを整数型と定めています。この代名詞は好きなように決めていいのです。ミゲル先生曰く、「あとで誰がみてもわかるものが良い」と言われましたが、ここをgundamと入れてもスケッチは動きます。intの詳しい説明は英文ここ日本語はここにあります。なぜvoid loop()で定義しなければならないわかりません。このあと、検証したいと思います。

検証1- int inputcharの働き
  int inputchar; のままで、oとp以外の文字を入れ場合

  • 英文字: 反応なし
  • 2英文字: 反応なし
  • 一桁の数字: 反応なし
  • 二桁の数字: 反応なし
  • 三桁の数字: 反応なし

  int inputchar; のままで、oとp文字を複数入れた場合: 指示通りに動いている
ということは何文字入れてもスケッチが動くということです。予想は一文字しか受けれないでした。

検証2- int inputcharの置き換え

  •   int inputchar;を削除した場合はコンパイルエラーとなりました
  •   char inputchar; とした場合、問題なく動きました(そのように見えているだけかもしれません)

検証3- int inputcharの置き換え
  word inputchar; とした場合、問題なく動きました?????

if (inputchar != -1)は全く意味がわかりません。教科書によるとif文により-1でなかった(!=)場合にのみを意味しているようです。

 もうこの辺でやめておきます。謎は後できっとわかることでしょう。

#009【49歳から始めるArduino -黒帯を目指せ】番外編 Arduino初心者クラスに参加
#011【49歳から始めるArduino -黒帯を目指す】黄帯編1-2 Lチカでなぜ抵抗がいるのか?

おまけ1:p42のスケッチ1に追記して、入力がoとp以外はメッセージを出して、正しい入力を催促することができます。

 スケッチはこちらです。色付き部分を追加しました。ちなみにIDEからスケッチをコピーペーすると、こんな感じになります。他の人は行毎に色が違ったりしていました。簡単にできる方法ってあるのでしょうか?Syntax Highlighterとgoogle-code-prettifyを使う方法があるようですが、ピンときませんというか手間がかかりそうな感じです。

#define LED 13

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int inputchar;

  inputchar = Serial.read();
  if(inputchar != -1){
    switch(inputchar){
      case 'o':
        Serial.println("LED ON");
        digitalWrite(LED, HIGH);
        break;
      case 'p':
        Serial.println("LED OFF");
        digitalWrite(LED,LOW);
        break;
      default:
        Serial.println("What's wrong with you? Input 'o'or 'p'please?");
    }
  }
}

おまけ2:p46のスケッチ2に追記して、入力がo、pそしてb以外はメッセージを出して、正しい入力を催促することができます。シリアルモニターでは10回点滅中の回数を表示させました。0が1回目となるので、0に1を足して、表示させています(色付き部分)。なんか良い感じですね。

#define LED 13

void blink10(){
  int i;
  for(i=0;i<10;i++){
    Serial.print("LED blinking: ");
    Serial.println(i+1);
    digitalWrite(LED,HIGH);
    delay(200);
    digitalWrite(LED,LOW);
  }
}

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int inputchar;

  inputchar = Serial.read();
  if(inputchar != -1){
    switch(inputchar){
      //Turn on LED
      case 'o':
        Serial.println("LED ON");
        digitalWrite(LED, HIGH);
        break;
      //Pause LED
      case 'p':
        Serial.println("LED OFF");
        digitalWrite(LED,LOW);
        break;
      //Blink 10 times
      case 'b':
         Serial.println("Blinking LED 10 times");
         blink10();
         break;        
      default:
        Serial.println("What's wrong with you? Input 'o'',''p' 'or b'please?");
    }
    Serial.println("READY");
  }
}
#011【49歳から始めるArduino -黒帯を目指す】黄帯編1-2 Lチカでなぜ抵抗がいるのか?

コメント