船、車、家、たまには旅行のこと等 備忘録も兼ねて気ままに書いています。

2024/01/19

Arduinoマイコンプログラミング勉強 イロハのイの字の段階です

event_note1月 19, 2024 editBy Noriyuki Tomimatsu forumNo comments
現在机の上にArduinoのお勉強キットを並べてプログラミングの勉強中。

プログラムを書くにはどんなコマンドがあるのかまた使い方はどうするのか憶えなきゃいけません。その意味ではまだ小学1年生で言葉の意味、てにおは、など覚えている段階でラブレターを書くには程遠いという段階です。

今教材としてやってるのは2個のLEDを時間間隔を空けて交互にちかちかさせることですが最終的に同じことをさせるにも色々な命令や道具の使い方があってなかなか奥が深いです。
ちなみにこの動作をトランジスタなど使ったハードロジックで実現しようとするとかなりの数のパーツが必要になります。 マイコン凄い!



まず最初に作ったプログラムがこちら、
前置きにいろいろ書かなきゃいけませんが割愛します。

 digitalWrite(LED_R, HIGH);  // turn the LED_R on (HIGH is the voltage level)
   delay(1000);                      // wait for a second
  digitalWrite(LED_R, LOW);   // turn the LED_R off by making the voltage LOW
  delay(1000);                      // wait for a second
  digitalWrite(LED_Y, HIGH);  // turn the LED_Y on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(LED_Y, LOW);   // turn the LED_Y off by making the voltage LOW
  delay(1000);                     // wait for 1 second

delayというコマンドを使った例ですがこのコマンドは直訳すれば「遅らせる」と言う意味ですが実際は「寝て何もするな」と言う命令に近いです。
このプログラム、マイコンを使用人に例えるなら旦那がこう命令するようなものです。
  1. 黄色のLEDを点けろ。
  2. 点けたら1秒間寝て何もするな
  3. 起きたら黄色のLEDを消せ
  4. 消したら1秒間寝て何もするな
  5. 起きたら赤のLEDを点けろ。
  6. 点けたら1秒間寝て何もするな
  7. 起きたら赤のLEDを消せ
  8. 消したら1秒間寝て何もするな
この繰り返しです。

次に作ったのが内部時計を見ながらのプログラム
使用人に対して
「時計を見ながら決められた時間経過したらその時間に決められたことをやりなさい」
と命令するものです。
時計は millis() で表されています。
ちょっとプログラム部分が長いので読み飛ばしてください。

 //starttime=millis();
  long currenttime=millis();

  if (state==0)
  {
    digitalWrite(Yled, 0);
    digitalWrite(Rled, 0);
  }

if (state==1)
{

if (currenttime - starttime < Yled_ontime)
  {
    digitalWrite(Yled, 1);
    Yled_state=1;
  }
  if (currenttime-starttime >= Yled_ontime)
  {
    Yled_state=0;
    digitalWrite(Yled, 0);
     
  }
if (currenttime - starttime >= Yled_ontime + Yled_offtime)
{
  starttime=currenttime;
}

 
  //Red LED controle


  if (currenttime - starttime < phaseshift)
{
  Rled_state = 0;
  digitalWrite(Rled, 0);
}
if ((currenttime - starttime >= phaseshift) && (currenttime - starttime < phaseshift + Rled_ontime))
{
  Rled_state=1;
  digitalWrite(Rled, 1);
}
else
{
  digitalWrite(Rled, 0);
}}
}

最後に作ったのが内部タイマーの時報に合わせて作業するというやつ。
別の言い方をすれメトロノームのカチカチに合わせて作業するようなもので
1個目の時報ではA,2個目の時報ではB,3個目の時報ではC,4個目の時報ではDをやりなさいと命令しています。
この例ではカチカチの数を数えて0,1、2,3個目と作業内容を変えています。

  timing = timing + 1;
  if (timing >= 4)
  {
    timing = 0;
  }

switch (timing)
{
  case 0:
  digitalWrite(Yled, led);
  digitalWrite(Rled, 0);
  break;

  case 1:
  digitalWrite(Yled, 0);
  digitalWrite(Rled, 0);
  break;

  case 2:
  digitalWrite (Yled, 0);
  digitalWrite (Rled, led);
  break;

  case 3:
  digitalWrite(Yled, 0);
  digitalWrite(Rled, 0);
  break;  
}
}

とにかくこの3方式どれもLEDの光り方は同じですが一長一短あって最初の方式は「寝てろ」と言う命令なのでこの間はマイコンは何もしません。
もしお客が来たとしても「はい、ご用は承っておきます」というだけでまた寝てしまいます。
2番目の時計見ながら方式は他のことやりながら時計を見ればいいのでマイコンはいろんなことをやることが出来ます。ただ他のことをやって時計を見に戻るので時間の正確さはいまいちです。
3番目の方式は時報に合わせるので正確な時間に作業をすることが出来ます。
その反面この時間帯は他の作業は中断と言うことになります。

う~ん、お勉強の内容の説明は難しいですね。
私の備忘録という面もありますが今後どう紹介するかは一考の余地ありですね。




0 comments:

コメントを投稿