羽黒A太(はぐろ えいた) F3A URFC 宇都宮

日記や趣味などについての記録です
ラジコン飛行機、マイコン、真空管アンプなど

ARDUINO(アルデゥイーノ) 3 C言語 LED チカチカ実験

2014-04-12 | ラジコン飛行機
ARDUINOボードだけで確認できるプログラムといえば、
LEDチカチカのようですね。
下がLEDチカチカのプログラムですが、C言語のmain()関数がありません。これは、main()関数で処理する内容が決まっているので省略してあるようです。
実際はC言語のコンパイラでエラーにならないように、main()関数も自動的に追加挿入されてコンパイルされます。
 
#define LED_PIN 13

void setup() {
  pinMode(LED_PIN, OUTPUT);
}
 
void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
}

それでは、プログラムの説明です。

#define LED_PIN 13

LED_PIN という文字列を 13 と定義するプリプロセッサ命令です。
プログラムの中で 13 と書きますと、後で何のことか忘れてしまいますから、13 とは書かずに、LED_PIN という文字列で表記できるようにするための定義文ですね。LEDのPIN番号のことだなと分かるということですね。

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

戻り値が void 、つまり戻り値がなく、setup() の括弧の中が何も書いてないので
引数もない、関数setup()ですが、特別な関数です。というのは、必ず最初に実行する関数だからです。プログラムの最初に、一度だけ初期化すれば良いような命令を記述する場合が多いです。

pinMode(LED_PIN, OUTPUT);

これを見ますと、 用意されているpinMode(,)という関数を利用して、マイコンのI/Oピンの属性を変える、つまり、I/Oピンの初期化処理を行うのだなと想像がつきます。
LED_PIN を OUTPUTモード、つまり13番ピンを出力用として使えるように初期化するということのようですね。(あくまで想像です)
 
調べてみますと、

pinMode(pin, mode)

ピンの動作を入力か出力に設定します。 
Arduino 1.0.1から、INPUT_PULLUPを指定することで、内部プルアップ抵抗を有効にできます。INPUTを指定すると、内部プルアップは無効となります。 

【パラメータ】 
pin: 設定したいピンの番号 
mode: INPUT、OUTPUT、INPUT_PULLUP 

【戻り値】 
なし 
 
mode として、INPUT、OUTPUT、INPUT_PULLUP のいずれかを記入しますが、どこかのファイルでこれらの文字列は、#define プリプロセッサ命令で定義されているものと思われます。この関数はC言語の標準関数ではなく、ARDUINOの開発側で用意してくれている関数です。こういう便利な関数がない場合は、自分でマイコンの説明書を読んで(普通は英文のままが多い)、その方法を学ばなくてはなりません。
 
void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
}
 
さて、この loop() 関数も setup() 関数の次に実行してくれます。

  digitalWrite(LED_PIN, HIGH);
  delay(1000);
 
これもARDUINO側で用意した関数ですね。
見れば何となく分かりますが、説明書を見てみますと、

digitalWrite(pin, value)

HIGHまたはLOWを、指定したピンに出力します。 

指定したピンがpinMode()関数でOUTPUTに設定されている場合は、
次の電圧にセットされます。 
HIGH = 5V (3.3Vのボードでは3.3V) 
LOW = 0V (GND) 
指定したピンがINPUTに設定されている場合は、HIGHを出力すると20KΩの
内部プルアップ抵抗が有効になります。LOWでプルアップは無効になります。 

【パラメータ】 

pin: ピン番号 
value: HIGHかLOW 

【戻り値】 

なし 

delay(ms)

プログラムを指定した時間だけ止めます。単位はミリ秒です(1,000ミリ秒=1秒)。 

【パラメータ】 

ms: 一時停止する時間 (unsigned long)。単位はミリ秒 

このパラメータはunsigned long型です。32767より大きい整数を指定するときは、
値の後ろにULを付け加えます。例 delay(60000UL); 

【戻り値】 

なし 

さて、C言語の文法を踏襲しているのですが、大きく異なる部分があります。
それは、C言語の #include や #define などのプリプロセッサ命令の記述を少なくし開発効率を上げようとした結果こうなったのかなと善意解釈することにします。

#define LED_PIN 13
 
void setup() {
  pinMode(LED_PIN, OUTPUT);
}
 
void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
}

上記のプログラムはC言語では、次のようになります。
#include "WProgram.h"
#define LED_PIN 13 

void setup () { 
 pinMode (LED_PIN, OUTPUT); // 13番ピンをデジタル出力設定
} 

void loop () {
 digitalWrite (LED_PIN, HIGH); // LEDを点灯 
 delay (1000); // 1秒待機 
 digitalWrite (LED_PIN, LOW); // LEDを消灯
 delay (1000); // 1秒待機
} 

int main(void)
{ 
 init(); 
 setup(); 
 for (;;){ 
 loop();
 return 0;
}
 
なんかゴチャゴチャして見えますが、C言語ではmain()関数を最初に呼び
出すようにするだけです。
setup()関数やloop()関数を記述してありますが、
それらは直接には実行はしません。
それらの関数は、main()関数の中から呼び出されて実行するだけです。
init()関数は、マイコンの初期化のための各命令が、ARDUINOの統合開発
環境で自動的に作成されます。他の環境で開発する場合は、init()関数を
自分で作ります。マイコンの説明書を見ながら、淡々と事務的に作るだけ
です。一度作っておけば、再利用できますので、一度はマイコンの説明書をみながら作るのも勉強になって良いと思います。

ちょっと分かりずらいのは、次の部分かと思います。
for (;;){ 
 loop();

これは、for文を理解しておかないと、意味不明となります。

for

for文は波カッコに囲まれたブロックを繰り返し実行します。
様々な繰り返し処理に活用でき、データやピンの配列と組み合わせて
使われることがあります。 

for文のヘッダは3つの部分から成り立っています。 

for (初期化; 条件式; 加算) { 
 //実行される文; 


まず初期化が一度だけ行われます。
処理が繰り返されるたびに条件式がテストされ、
trueならば波カッコ内の処理が実行され、加算が行われます。
次に条件式がテストされたときにfalseならば、
そこでループは終了します。 

for(;;)のように省略された場合は、次の文または、波型括弧で挟まれた
部分が永久ループ状態となります。


ARDUINO(アルデゥイーノ) 2 C言語 hello,world

2014-04-07 | ラジコン飛行機

パソコンでC言語を学ぶ場合、キーボードやディスプレイなど標準入出力装置が存在しているという前提でサンプルプログラムが用意されています。

以下のサンプルプログラムは、画面に hello,world と表示するものですが、C言語の入門書の最初に必ず出てくるものですね。

BASIC言語なら、

10 print "hello,world"

と、1行で済んでしまいますが、C言語ですと以下のようになります。

---------------------------------

#include <stdio.h>

int main()

{

    printf("hello, world\n");

    return 0;

}

---------------------------------

これだけ見ますと、C言語の方がプログラムが複雑そうですが、実用的なプログラムのサイズになりますと、C言語の長所が際立ってきます。

C言語の場合、プログラム作成とは関数を作ることです。C言語で関数というのは、次の書式となります。/* と */ で挟まれた部分は、コメントですよ、という意味になり命令として解釈はしなくなります。

int abcd() /* ここから abcd 関数 を記述 */

{ /* 波型括弧が始まり abcd関数の始まりを示す */

} /* 波型括弧が終わり abcd関数の終わりを示す */

さて、関数というからには、その関数にデータを渡したり、関数が処理した結果を貰ったりする形が必要です。

int abcd(int data)

最初の int は関数の戻り値の型は整数型を表しています。()の中の int data は、整数型の引数をdataという変数に入れておきますという意味です。

引数がない場合、()の中は void を記述するか、何も記述しません。

int abcd(void)

int abcd()

サンプルプログラムでは、

int main()

となっていますので、引数はなく、整数型の戻り値のあるmainという関数であることが分かります。

C言語の場合、このmain関数は特別な関数で、プログラムの最初に実行する関数です。

printf("hello, world\n");

これは、標準入出力ライブラリの printf() という関数を使っています。

ですから、printf()関数そのものを作成しなくても利用できるわけです。

この関数は、画面に文字や数値を表示する場合に使用します。

最後の ; (セミコロン)は必ず付けます。これが関数実行文などの命令の終端を表します。

()の中の \n は改行です。printf() は自動的に改行しないので、明示的に指定します。

return 0;

この命令を実行すると、現在処理している関数を終了します。

そして、この場合は、戻り値として0が指定されていますので、main関数の戻り値は0となります。

#include <stdio.h>

これは、この場所に stdio.h というファイルの中身を挿入せよというプリプロセッサ命令です。

stdio.h には、標準入出力関数の定数や関数のプロトタイプなどが記述されています。

C言語は、関数のプロトタイプ書式を予め宣言しておき、その宣言と使い方が異なる場合は、警告を出してくれる機能があります。戻り値の型が違っていたり、引数の型や数が違っていたり、記述ミスを防止する上で便利です。

さて、ARDUINOのようなマイコンボードの場合、キーボードやディスプレイなどはありませんので、プログラムの勉強用としての最初のサンプルプログラムは、LEDの点滅実験のようですね。LCDディスプレイが載った周辺基板も発売されていますので、付けておくと便利です。この状態で1390円のようですが、ディスプレイ部品単体では800円のようです。参考写真はスケールが違いますが、同じものです。




 




 


ARDUINO(アルデゥイーノ) 1

2014-04-03 | ラジコン飛行機

前回紹介したARDUINO UNO(アルデゥイーノ ウノ)というマイコンボードの

仕様ですが、これだけ見て、どの程度のものか分かる人は、すでにマイコン

経験者ですね。

他の趣味の人が、読み物として軽く読んでみるためには仕様の説明が必要

でした。m(_ _)m

主な仕様

・搭載マイコン      :ATmega328

   米国のアトメル社(Atmel Corporation)が開発した8ビットのマイクロ

   コントローラですね。

   アトメル社はマイクロコントローラと称しています。

   省略してマイコン。でも、マイコンといいますと、マイクロコンピュータ

   の略かなと感じますが、どちらでも関係ないことですね。

   マイコンというのは、演算を行うCPU(MPU)、プログラムメモリ、

   作業用メモリ、その他メモリ、周辺回路(シリアル通信、タイマー、

   PWM制御、ADコンバータ、その他色々)などの機能が、ひとつのLSIとして

   パッケージされています。

   パソコンの基板の場合は、各々が部品としてマザーボードに搭載されて

   います。ですから、メモリーを増設したりできますが、普通マイコンは

   それができません。

・マイコン動作電圧  :5V

   基板内部でマイコンの電源端子に印加する電圧です

・ボード入力電圧    :7-12V

     外部の直流電源から、このボードに接続する電圧です

     7~12Vの出力のDCアダプタから電源を供給しますが、

     基板内の3端子レギュレータによって5Vになり

     それがマイコンの電源端子に印加されます

・ディジタルI/Oピン:14

     ディジタル(0Vか5Vかのいずれかの値)として入出力できる端子が

     14ケあります

・PWM出力可能ピン:6

     ディジタルI/Oピン14ケの中で、PWMとして使用できるのは6ケあります

     PWM(pulse width modulation)とは、パルスの幅を変化させて信号を

     伝達する方式ですが、ソフトでON-OFFを制御しなくても、

     周期やデューティー比などをセットしてスタートさせるだけで

     自動的にPWM波形を出力してくれます

・アナログ入力ピン  :6

     アナログ値を入力できるピンが6ケあります

     A/Dコンバータで、0~1023の数値になります

・フラッシュメモリ  :32 キロバイト

       プログラムや初期値データ用のエリアとして32キロバイト使用できます

       電源を切っても、消えません

       1キロバイトは、1024バイトです

       1バイトは8ビットです

       1ビットとは、0か1かを記憶することができます

       メータ式の遅延式ヒート装置ですと、1.5キロバイト程度の

       プログラムです

・SRAM          :  2 キロバイト

           一時作業用のメモリです

       電源を切ると、消滅します

・EEPROM      :  1 キロバイト

          電気的に消したり書いたりできるメモリで、電源を切っても

      消えませんが、10万回程度しかできません

・クロック周波数    :16 MHz

      このボードには16MHzの水晶発振子が付いています

      このマイコン自体は20MHzまで対応しています

      殆どの機械語命令は、1サイクルで処理すると書いてあります