Arduino(アルドィーノ)電子工作

電子工作はマイコン、電子回路を接続して動作させるには、
回路知識やプログラム知識が必要になる

Arduinoは教育用に開発された簡単なボードと簡易プログラムである
これは、初心者でも入門しやすい

マイコンやC言語を知っている場合は逆に面倒かもしれない、、、、、

初めに、ボードと本を入手しよう

 


最初に、LEDとスイッチを作る。
リード線の先端はソケットに差しやすいように ピンにしている



Arduino IDE をサイトからダウンロードしよう
プログラムを書いたら、 左のチェックマークをクリックする。 エラーがあると赤文字で表記される
コンパイルできたら、
矢印のマークをクリックすると、ボードにプログラムが転送される

このボードは Arduino UNO R4 WIFI である。
設定すると、基板のファイルがインストールされる。







さて、最初に取り組むのは、LEDの点滅とスイッチ操作である。
これが旨くできると、後は芋づる式にプログラムがつくれるようになる

1) int で ラベルを作る
2) setup で ラベルを定義する
3) プログラムは loop に書き込む

大文字を小文字で書くと エラーになるのが注意である
ーーーーーーーーーーーーーーーー
LED1、LED2 、OUTPUTに定義する ポートは 10と11である
スイッチ2個は inpin と inpin1 で ポートは1と2 INPUTに定義する
タイマーは delay( ***) msで定義する

これで、LED1が HIGH ーー>500msーー>LED1=LOWーーー>500ms
点滅が繰り返される

スイッチは inpin が 0(LOW)になると if文が実行される
スイッチは 抵抗でプルアップしていれば、そのままでもよいが、
マイコン内部でプルアップできるので、 
    pinMode(inpin, INPUT_PULLUP) 
この構文で 内部プルアップしている

int LED2 = 10;
int LED1 = 11;
int INTERVAL = 500;
int inpin = 2;
int inpin1 = 1;
int count;
void setup() {
              pinMode( LED2,OUTPUT);
              pinMode(LED1,OUTPUT);
              pinMode(inpin, INPUT);
              pinMode(inpin1,INPUT);
              pinMode(inpin,INPUT_PULLUP);
              pinMode(inpin1,INPUT_PULLUP);
              Serial.begin(9600);
            }

void loop() {
            digitalWrite( LED1,HIGH);
            delay(INTERVAL);
            digitalWrite(LED1,LOW);
            delay(500);
            if(digitalRead(inpin) == 0){ digitalWrite(LED2,HIGH);
                                      count=count+1;
                                      //Serial.print( "count:")
                                      Serial.println(count);
                                      delay(200);
                                      }




動作確認するには、LCD表示器などが便利である
今は表示器がない。
しかし、シリアル通信で、Arduino IDE のシリアルモニターを使う事で、
ある程度、計算値などを 表示できる


ツールの中から、シリアルモニターを起動させる

プログラムの中に
    Serial.println(count);

 これは、count と言う数字を パソコンの シリアルモニターに表示させている


温湿度デバイス  SHT31



最初は本のとおり、SHT31 デバイスを使って I2C通信をしてみよう。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

初めに、AVRマイコンで C言語で動作プログラムは下記になる

//---- 読み取りREAD ondo -------------
void ONDO_READ(void)
{
int i;

TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
/* 開始条件送出*/

TWDR=0x88;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

TWDR=0x2C;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

TWDR=0x06;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

/* 停止条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTO) |(1<<TWEN);

wait_ms(1);

TWCR = (1<<TWINT)|(1<<TWSTA) |(1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機

TWDR=0x89;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機


TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //
o_data[1]=ans;

TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //
o_data[2]=ans;

TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //
o_data[3]=ans;


TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //
o_data[4]=ans;


TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //
o_data[5]=ans;


TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN); //ACK
while(!(TWCR & (1<<TWINT))); //;TWINT=1まで待機
ans=TWDR; //
o_data[6]=ans;


/* 停止条件送出*/
TWCR = (1<<TWINT)|(1<<TWSTO) |(1<<TWEN);
}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
1) アドレス 0x88ーー>0x2C --->0x06 を送り 設定する
2) 0x89 を送ると 6バイトのデータが戻ってくる
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

アルドィーノ プログラムの場合は、アドレス は 0x44 をそのまま送る
beginTransmission(0x44)
Wire.write(0x2c)
Wire.write(0x06)
で設定する

受信は
 Wire.requestForm (0x44, 6)

6バイトのデータを受信する    Wire.read()


Wire.beginTransmission(SHT31);
            Wire.write(0x2C);
            Wire.write(0x06);
            Wire.endTransmission();
            delay(300);
            digitalWrite(LED2,LOW);
           Wire.requestFrom(SHT31, 6);
            for ( i = 0 ;i < 6 ; i++){
                 dac[i] = Wire.read();
                 }

            Wire.endTransmission();



シリアルモニタを起動すると
温度 28.35度
湿度 63.61%