らずらいと姫の挑戦日記(第12回)~コントローラーのプログラムを作るぞ!①~
2016-06-21

今回から鶴を飛ばすためのコントローラーのプログラムを考えていきます!プログラムの基礎から勉強しました。
前回までに、ORIZURUコントローラーのスイッチとレバーの仕組みを勉強しました。今回から、実際にORIZURUを操作するためのプログラムを少しずつ勉強していきたいと思います♪
ORIZURUのスイッチは全部で6個あります。6個の結果を1個ずつ送信していたら時間がかかってしまいます。そこで、スイッチのON・OFFの結果を1つにまとめて送信できるプログラムを考えてみました!そのプログラムがこれです↓↓↓
[c]
void setup()
{
// put your setup code here, to run once:
unsigned char i;
for(i=3;i<=8;i++)
{
pinMode(i,INPUT_PULLUP);
}
Serial.begin(115200);
}
void loop()
{
// put your main code here, to run repeatedly:
unsigned char sw;
unsigned char i;
sw=0;
for(i=3;i<=8;i++)
{
sw = (sw <<= 1) + ((digitalRead(i) == LOW) ? 1 : 0);
}
// data_packet[1]=(short)sw;
// Serial.print_long((long)data_packet[1],BIN);
Serial.print_long((long)sw,BIN);
Serial.println("");
delay(500);
}
[/c]
unsigned char
4・16・17行目
データサイズの型名です。
まず、コンピューターは【0と1】のみで出来ている、という事は聞いたことがあります。その【0と1】が1マスに1つずつ格納されています。そのマスを『bit』とよぶそうです。
【0と1】がデータで、『bit』がサイズ・容量ですね。
8bitならマスは8個、16bitなら16個、32bitなら32個と『bit』が大きくなれば、より多くの【0と1】を格納することができますね。
その『bit』に名前が付いていて、8bitはchar型、16bitはshort型、32bitはlong型、64bitはlong long型とよんでいるそうです。また、正のみ(unsigned)か正負(signed←省略可)も選べます。int型はマイコンによってサイズが変わるそうなのですが、Lazuriteのマイコンは16bitで、またlong long型(64bit)には対応していないそうです。
今回はスイッチの結果の【0と1】を1マスに1つ入れていくプログラムです。その【0と1】が6個なので、一番小さいサイズで、負の値は必要ないのでunsigned charを使用します。
for(A ; B ; C)
6・20行目
ある条件になるまで、繰り返すものが『for』だそうです。とてもよく使われるそうです。
- A→初期状態
- C→iに1を足していく
- B→継続or終了の判断
最初にAを実行し、CがBの継続条件ならCを実行、CがBの終了になるまで繰り返す。
(sw << 1)
22行目
swの結果データを1ビット左にずらす
(digitalRead(i) == LOW) ? 1 : 0
22行目
(i)がLOWなら1、違ったら0にする
今までは、LOWで0、HIGHで1でしたが、逆のほうが見やすいので、LOWで1、HIGHで0に設定しました。
20~22行目は、こんな感じです↓↓↓
3番から8番ピンの状態をよんで、その結果を1bitずつ入れていきます。実際にはピンの結果の0か1が入ります。
Serial.print_long((long)sw,BIN)
27行目
シリアルモニタに表示させる関数ですが、データを最大おくれるようにlongにしています。データを渡す時には容量を大きく設定しておけば間違いないですよね。
でも、16行目ではcharを使用していますが、大丈夫です。Serial.print_long((long)sw,BIN)のlongとlongを合わせればOKです
BIN(バイナリ)について
0と1で表現する機械語のことです。
あと、人間が普通に使う数字DEC(デシマル)と、数字とアルファベットで出来ているHEX(ヘキサ)がよく使われます。
今回はスイッチ6個の結果を【0と1】の状態で知りたいので、表示方法をBINにしています。
プログラムを動かしてみよう♪
コントローラーのスイッチはそれぞれ下記の番号のピンに繋がっています。
まず、何もスイッチは押していません。なので結果は00000000ですが、先頭の0は表示されないので、0が1つの表示になります。
スイッチを色々押してみます♪
6個のスイッチの結果【0と1】が、押されたら1、押されなかったら0でまとめて表示されています。
スイッチのデータはまとめられたので、次はその結果を無線で送信するプログラムを考えたいと思います☆