Section outline

        • Wokwiにアクセスし,Arduino Unoを選びます。

          次のような回路を作成し三角の緑のボタンを押すとLEDが点灯します。

          なお,抵抗値は次のような計算により300Ωです。

          5Vに接続。LED両端電圧を2V,流す電流を10mAとすると,

          5=R×10×10^{-3}+2よりR=300Ωとなります。

          電源5Vに接続しているので,プログラム不要です。

          LED1

        • WorkwiでArduino unoを選びます。

          次のような回路を作成します。

          LED点滅

          プログラムは下を貼り付けます。次に緑の三角のボタンを押すとLEDが点滅します。

          int LED = 10; //変数LEDに10を代入

          void setup() {
            pinMode(LED, OUTPUT);
            //PD10を出力に設定
          }

          void loop() {
            digitalWrite(LED, HIGH);
            //P10の電圧を5Vにする=点灯
            delay(300); //0.3秒待機
            digitalWrite(LED, LOW);
            //P10の電圧を0Vにする=消灯する
            delay(300); //0.3秒待機
          }
        • 次のような回路を組みます。

          サーボモータ

          なお、次の図のようにLibrary Managerにおいて,servo_mortorを追加します。

          マネージャ

          パルス幅で回転角を調整します。
          s
           
           
          #include <Servo.h>

          int SERVO_SOKET = 9; //ソケット番号の指定

          Servo myServo;   // サーボモータ制御用のオブジェクト

          void setup() {
            myServo.attach(9);  // サーボモーターをデジタルピン9に接続
          }

          void loop(){
            myServo.write(0);      // パルス幅0.5m秒
            delay(1000);  // 1秒停止
            myServo.write(90);     // パルス幅1.45m秒
            delay(1000);  
              myServo.write(180);  // パルス幅2.4m秒
            delay(1000);  
          }
        • 下の回路図を作成します。なお、抵抗はすべて330Ωです。

          かいろ

          下のプログラムを動作させると、1分経つと1番目のLEDが消え、2分経過で2番目のLEDが消え、3分で3番目のLEDが消えます。

          // ピンを設定
          int LED_1 = 13;
          int LED_2 = 12;
          int LED_3 = 8;

          void setup() {
            // ピンのモードを出力に設定
            pinMode(LED_1, OUTPUT);
            pinMode(LED_2, OUTPUT);
            pinMode(LED_3, OUTPUT);
          }

          void loop() {
            digitalWrite(LED_1, HIGH);  //LED_1を点灯
            digitalWrite(LED_2, HIGH);  //LED_2を点灯
            digitalWrite(LED_3, HIGH);  //LED_3を点灯

            delay(60000);              //1分待つ
            digitalWrite(LED_1, LOW);   //LED_1を消灯

            delay(60000);              //1分待つ
            digitalWrite(LED_2, LOW);   //LED_2を消灯

            delay(60000);              //1分待つ
            digitalWrite(LED_3, LOW);   //LED_3を消灯

            delay(3000);              //終了後、3秒待つ
          }
        • 次のような回路を組みます。

          tree

          なお,LEDの配置は次の図のようです。

          配置

          (プログラム例)

          void setup() {
            for (int i = 2; i <= 10; i++) {
              pinMode(i, OUTPUT);
            }
            randomSeed(analogRead(0));
          }

          void loop() {
            int ptnData = random(0, 512);

            // iが2から10まで増えながら、順番に書き込む
            for (int i = 2; i <= 10; i++) {
              // i-2 とすることで、ピン2のときビット0、ピン10のときビット8を読み込む
              digitalWrite(i, bitRead(ptnData, i - 2));
            }

            delay(1000);
          }
        • 回路はその1と同じです。

          回路2

          (プログラム例2)

          // 全部が点滅してから,ランダムに光りだす。

          void setup() {
            // すべてのピン(2〜10)を出力に設定
            for (int i = 2; i <= 10; i++) {
              pinMode(i, OUTPUT);
            }
           
            randomSeed(analogRead(0));

            // --- オープニング演出:3回点滅 ---
            for (int count = 0; count < 3; count++) {
              // すべて全灯
              for (int i = 2; i <= 10; i++) { digitalWrite(i, HIGH); }
              delay(200);
             
              // すべて消灯
              for (int i = 2; i <= 10; i++) { digitalWrite(i, LOW); }
              delay(200);
            }
            delay(500); // 少し間を置いてから本編へ
          }

          void loop() {
            // メイン:一斉ランダム点灯
            int ptnData = random(0, 512);

            for (int i = 2; i <= 10; i++) {
              digitalWrite(i, bitRead(ptnData, i - 2));
            }

            delay(1000);
          }
        • Arduino 本体のメモリ容量は小さいです。後で記します。このためにポインタの理解が必要なことがあります。ポインタの動作を少しだけ理解しましょう。下の図のようにプログラムを貼り付けます。

          が

          (コード)

          void setup() {
            Serial.begin(9600);      //9600bpsでシリアルポートを開く
          }

          void loop() {
            int A = 1, B = 0;            //[1] int型変数A,Bを宣言してそれぞれ1,0を格納
            int *P1, *P2;                 //[2] ポインタ変数の宣言の仕方その1(参考)
            int* P[] = {NULL, NULL};     //[3] ポインタ変数の宣言の仕方その2(以下使用)
            P[0] = &A;              //[4] int型変数Aの前に"&"を付けるとAのアドレスを返しポインタ変数P[0]に格納
            Serial.println((int)P[0]);  //[5] ポインタ変数P[0]に格納されたアドレスをシリアル出力可能なint型にして出力
            P[1] = P[0];                  //[6] ポインタ変数P[0]のアドレスをポインタ変数P[1]にコピー可能
            Serial.println(A);            //[7] int型変数Aをシリアル出力
            *P[1] = 2;                   //[8] P[1]の住所の中身を2に設定
            Serial.println(A);            //[9] int型変数Aをシリアル出力
            B = *P[1] + 1;               //[10] 変数BにP[1]の住所の中身に1を足した数を格納
            Serial.println(B);            //[11] int型変数Bをシリアル出力
            delay(3000);                 //[12] 3秒待つ
          }
           
          出力に関しては、次のように解釈できます。
          かい

          (参考)

          Arduino UNO R3のメモリ容量は、プログラム保存用のFlashメモリが32KB(うち0.5KBはブートローダー使用)、実行時データ保持用のSRAM(メインメモリ)が2KB、電源OFFでもデータが消えないEEPROMが1KBです。

          ポイント:なぜこれを使うの?

           ポインタを理解すると以下のような高度なことができるようになります。

          1. 関数の外にある値を書き換える: 別の関数に「住所」だけを教えて、中身を更新してもらう。

          2. メモリの節約: 大きなデータをコピーするのではなく、住所だけをやり取りして処理する。

          3. 配列の操作: 配列の先頭住所を使って、効率的にデータを読み書きする。

          ず

          メモリの種類と容量
          • Flashメモリ(プログラムメモリ): 32KB (32,768バイト)
            • スケッチ(プログラム)を保存する領域で、書き換え可能ですが、書き換え回数に制限があります。
          • SRAM(静的RAM・メインメモリ): 2KB (2,048バイト)
            • プログラム実行中に変数などを一時的に保存する領域です。電源を切ると消えます。
          • EEPROM(不揮発性メモリ): 1KB (1,024バイト)
            • 電源を切ってもデータが消えない領域で、設定値などを永続的に保存するのに使います。