実験テーマ158

「Arduino UNO R3初体験+スケッチによるSSD1306_OLEDの表示実験」
(これまで敬遠してきたArduinoの初体験とライブラリを使わないスケッチによるAscii文字表示実験です)

■ 2025.01.24
  ・この手の開発環境は、初めてなので、Arduino UNOの代表選手である「Arduino UNO R3」4620円にしようと思う。
   秋月で買うと、3630円(税込み)→ 手配済


■ 2025.01.27
  ・13:00頃「Arduino UNO R3」ボード届く。
   本体の他、小さい印刷物が2冊とサービスシールが入っていた。


 
 <小さい印刷物>
  @ 「THANK YOU FOR CHOOSING AN ARDUINO BOARD AND SUPPORTING THE COMMUNITY ∞」と書かれている表紙

     ARDUINOボードをお選びいただき、コミュニティをサポートしていただきありがとうございます

  A 「Model SKU:A000066
     -------------------------------------------
     See the complete product user manual at:
     docs.arduino.cc/manuals/A0000066
     -------------------------------------------
     RoHS/ Compliant                       」

     完全な製品ユーザーマニュアルは、次のサイトをご覧ください:
     docs.arduino.cc/manuals/A0000066
     (RoHS準拠)


■ 2025.01.29
  ・「Arduino UNO R3」ボードを動かしてみる。

  <martsサイトの「Arduino IDE環境構築メモ」記事と「Engineer Labo」サイトの記事が参考になった。以下要点を下記してみました。今日は学習です。>
  ・Arduinoの開発環境であるArduino IDE(Integrated Development Environment)は、
   Arduinoボード上で動作するソフトウェアを開発するために作られた統合開発環境です。
    @ ソースコードの編集や、コンパイル、リンク、作成されたオブジェクトのボードへの書込み機能などが提供されます。
    A またプログラム実行時には、Arduinoボードとデータの送受信を行う「シリアルモニタ(コンソール機能)」と
       Arduinoボードからのデータをグラフ化して表示する「シリアルプロッタ機能」なども提供されます。 
    B 様々なArduinoボードに対応するためのボードパッケージを管理、取込むための「ボードマネージャ」や
       各種I/O(センサー等を含む)サポートするライブラリを管理、取込むための「ライブラリマネージャ機能」があり、
       これを利用して本家Arduinoボードだけでなく、多くの3rd Partyのマイコン、マイコンボードベンダー*1が
       ボードパッケージやI/Oライブラリを提供しており、自社のマイコン、マイコンボー一することで、異なるボード間での移植性が高まったり、
       Arduino環境向けに開発された各種センサーやI/O制御ライブラリがそのまま利用できるなど多くのメリットが得られます。

  (1) 環境構築の大まかな流れ

  (2) Arduino IDE インストール方法
    ※ Arduinoの公式ページから、統合開発環境であるArduino IDEをインストールする。 

    @ 右側の「DOWNLOAD OPTIONS」から「Windows Win 7 and newer」をクリック。
    A 寄付の依頼のページに移るが、寄付は必須ではない。
       「JUST DOWNLOAD」をクリックするとダウンロードを開始する。
    B インストーラーであるexeファイルのダウンロードが完了したら、ファイルを開く。
    C ライセンス契約に関する説明書きが表示されるので「I Agree」をクリック。
    D インストールのオプションを選択する。デフォルトではすべてにチェックが入った状態ですが、
       このまま続けて問題ない。「Next」を押すと次の画面に移る。
    E インストールするフォルダを選んだら「Install」を押す。C:\Program Files(x86)\Arduino
    F 環境によるが、約1分程度でインストールが完了。
       完了したら「Close」を押してセットアップ画面を閉じる。

    G 先ほどインストール場所として選択したフォルダに「arduino.exe」がインストールされている。
       ファイルを開くとArduino IDEが立ち上がる。初期画面が立上ればOK



  (3) 動作確認
    @ ArduinoとパソコンをUSBケーブルで接続すると電源が投入される。
    A 次にArduino IDEを開いた状態で、「ツール」⇒「シリアルポート」を選択し、
       Arduinoを接続したUSBのポートを指定する。
       接続したArduinoのモデル名が表示されていることを確認する。
       [ツール]
         |-- [シリアルポート] → COM4(Arduino Uno)

    B 今回は動作確認として、Arduinoの基板上にあるLEDを点滅させるサンプルプログラムを動かす。
       なお、Arduinoではプログラムのことを「スケッチ」と呼ぶ。
       Arduino IDEのウィンドウから、「ファイル」⇒「スケッチ例」⇒「01.Basics」⇒「Blink」と選択。
            以下のようにBlinkのサンプルスケッチを開く。

// the setup function runs once when you press reset or power the board
void setup() {
// initialize didital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT); 
}

// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000); 
}

    C そのままArduinoの基板上のマイコンに書き込む。
       ウィンドウ上部に並んだアイコンのうち、左から2番目の (->)「マイコンボードに書き込む」のアイコンをクリック。
    D コンパイルが実行され、問題なければサンプルスケッチをマイコンボードに書き込む。
    E Arduinoの基板上の「L」と記載された箇所にある、オレンジのLEDが点滅。これで動作確認は完了。


■ 2025.01.30
  ・Arduino IDEをインストール後、起動したが、以下のWindows Defenderの重要な警告が出た。



  → web検索したらこのまま [(+)アクセスを許可する]クリックで良いようなので、そうした。(小林@筑波技大/福祉工学やら支援技術やらサイト)
     暫く様子見する。
     尚バージョンは「Arduino IDE 2.3.4」だった。

  → さらに調べてみた。
    ・mdns-discovery
     公式のページによると、mdns-discoveryとは利用可能なネットワーク ポートを見つけるためのmDNS検出ツールとのこと。

     Arduino IDE には、利用可能なネットワーク ポートを見つけるために使用される mDNS 検出ツールが含まれています。
     新しいバージョンの mdns-discovery が利用可能になると、Arduino IDE によって自動的にインストールされます。
     新しいバージョンは、コンピュータによって新しいアプリケーションとして扱われる場合があります。 
     このため、更新後にアプリケーションがネットワーク上で通信できるようにする必要がある場合があります。


■ 2025.01.31
  (1) ボード上のL1 LED(橙)のLチカテストを試した。
    @ まずArduino IDE:v2.3.4を立上げたが、英語表示だった。
      <日本語表示にする手順>
       @ [File]- [Preferences]
       A [Preferences]ダイアグからLanguage:[日本語]を選択
            B [OK]クリック

    A シリアルポートの設定法が、新しいバージョンでは異なっていた。
       USBケーブルを接続したら「不明なデバイスをセットアップしています」と出てセットアップが完了した。
       <接続機種選択〜Lチカ>
        @ [ボードを選択]
            |- Arduino Uno
               COM3



        A これでArduino Unoが接続機種として設定される
        B 本体内蔵のLED点滅サンプルプログラムを読み出す
          ・[ファイル]- [スケッチ例]- [01.Basics]- [Blink]をクリックして、内蔵LED点滅サンプルプログラムを読みだす。
          ・新たなIDEウインドウにソースが表示される。
        C サンプルプログラムをArduino本体に転送する
          ・ウィンドウ上部に並んだアイコンのうち、左から2番目の (->)「マイコンボードに書き込む」のアイコンをクリック
           するとコンパイルが始まりエラーが無いと、そのままRUNする。
          ・内蔵LED_L1(橙)点滅動作を確認
           Arduino内蔵LEDが1秒間隔で、点灯と消灯を繰り返す動作を行っているか確認した。-> OK


■ 2025.2.7
  ※ 今年の「aitendo福BOXの中に、学習シールドUNO対応:GK-SLD1があった。
  (1) IDEのスケッチライブラリに「MultiFuncShield-Library」があるのでインクルード〜インストール〜書込みまでして試す。
     @ [スケッチ]- [ライブラリをインクルード]- [ライブラリを管理]
     A 左ペインに[ライブラリマネージャ]が表示される。
     B 上部の[検索をフィルタ]窓に [MultiFuncShield-Library]と入力
        検索完了すると下に「MultiFuncShield by @hpsatum. Cohesive...」の説明コメントが表示される。
        ([詳細情報]をクリックすると「GitHub」の「hpsaturn/MultiFuncShield-Library」のページに飛ぶ。)
        IDEに戻ってその下の[インストール]をクリック

     C すると以下のダイアログが表示される。

        「ライブラリの依存関係をインストール
   
         ライブラリMultiFuncShield:1.0.3には、現在インストールされてない複数の依存関係が必要です。
        
          ・EEPROMEx
          ・Servo
          ・TimeOne

         不足している全ての依存関係をインストールしますか?

                           [依存関係なしにインストール] [全てをインストール]           」
                                               ↑
                                              クリック

        → ※ インストールに成功した。 

     D インストールされたサンプルスケッチを確認
       ・[ファイル]- [スケッチの例]- [カスタムライブラリのステッチ例]
        - [MultiFuncShield」
          |- 01 Basic Input Output
               |- Beeper
               |- Beeper_Fix_if_Always_On
               |- Buttons
               |- Led_Display
               |- Led_Lights
               |- Preset_Pot

          |- 02 Reading Sensors
               |- MPU6050 // 3軸ジャイロセンサ(角度・加速度・角速度)amazonでモジュール基板(8pin)が480円
               |- Pulse_Counter
               |- Pulse_Counter_2
               |- Sonar_Module
               |- Temp_Sensor // LM-35:3端子温度センサ

          |- 03 Applications
               |- Alarm_Clock
               |- Basic_Timer
               |- Cuont_Down_App
               |- Heat_Monitor
               |- Level_indicator
               |- Sonar_Ranger
               |- Speed meter   

     E <01 Basic Input Output - Beeperを試す>
        ・IDEを起動すると
         「一部のライブラリにアップデートだあります。
           [後で] [手動でインストール] [全てをインストール] 」

         と出たので、 [全てをインストール] をクリックした。

        ・01 Basic Input Output - Beeperを開きUNOに書き込む。→ コンパイル〜 書込み成功

        ・<結果>
         @ ソースを見ると、最初0.2秒”ピッ”と短く鳴った1秒後、
           ビープ音のON時間=50mS/OFF時間=50mSの矩形波を
           4回 ”ピ・ピ・ピ・ピ”と鳴らし、これを0.5秒毎に3回繰り返して停止して終了という動作になるはず。
         → この通りだった。OK


■ 2025.2.9
     F <01 Basic Input Output - Buttonsを試す>
      ・01 Basic Input Output - Buttonsを開きUNOに書き込む。→ コンパイル〜 書込み成功

      ・<結果>
       ※ IDEのシリアルモニタを立上げて([ツール]- [シリアルモニタ])それにスイッチステータスを表示してチェックを行う。OK



       @ [S*]ON
        ・短く押した場合
         -> BUTTON_*_PRESSED
           BUTTON_*_SHORT_RELEASE

        ・長く押した場合
         -> BUTTON_*_PRESSED
           BUTTON_*_LONG_RELEASE 

                      NOTE1:S*は、S1, S2, S3のボード上の3個のタクトスイッチ

     G <01 Basic Input Output - Led_Displayを試す>
       ・01 Basic Input Output - Led_Displayを開きUNOに書き込む。→ コンパイル〜 書込み成功

       ・<結果>
        @ 4桁7セグLEDに"Hi"〜 "-273"〜 "3.141"からインクリメントを順次表示し、終了すると"End"がブリンク -> OK


■ 2025.2.16
     H <01 Basic Input Output - Preset_Potを試す>
       ・01 Basic Input Output - Preset_Potを開きUNOに書き込む。→ コンパイル〜 書込み成功
 
       ・<結果>
        @ 基板上の多回転ポテンショ可変による電圧変化:0〜5VをAD変換し、7セグLEDに "0〜 1022"を表示する。 -> OK


■ 2025.4.17
  ・だいぶ時間が空いてしまったが、ここでIDEのスケッチライブラリを使わないで独自にコードを書いてみる。
   以前PIC24Fで、動かしたOLED表示プログラム(今回はアスキー文字表示のみ)を、arduinoに移植する形で進めたい。


■ 2025.4.18
  ・ARDUINO_OLED_TEST_1.ino+Ascii_font.hファイルの作成完了
   以下の手順で、プロジェクトフォルダ作成〜コンパイル〜書込みまで行う。

   (1) [ARDUINO_OLED_TEST_1]新設〜コンパイル〜書込み
     @ 別の場所に、必要なファイルを用意しといて、
        ideを立ち上げた後、表示されているtagにそのソースをコピーし
        [ファイル]-[名前を付けて保存]-[スケッチフォルダを別名で保存」をクリック
        [ARDUINO_OLED_TEST_1]- [保存]で新たなiedウインドウが立上る。
        [ARDUINO_OLED_TEST_1.ino]タグの下にソースが表示されている。

     A 次にide上部タスクバーの右側にある[---]- [新しいタブ]をクリック
     B [新しいファイルの名前]ダイアログが表示されるので、 [Ascii_font.h]と入力し [OK]をクリック
       するとこの名前のタグが追加される。
       そこに別の場所に保存されている[Ascii_font.h]の内容貼り付ける。

     C ここで (v)をクリックするとコンパイルのみ実行される。
       <コンパイル履歴:>
        ・250418:
         void SPI_tx_byte(unsigned char d,int dc)で、SPI_CS = 0;又は1;としている箇所でエラー
         他のもSPI_RESET= 0;とかしている箇所あるがエラーメッセージは出てない?
         → そもそも記述そのものがarduinoに準拠してない。
            例えば、digitalWrite(OLED_RESET, HIGH);と書く必要がある。
            当該箇所を全て修正した。

          ※ その他細かい凡ミスがあったがコンパイルまでokになる。


■ 2025.4.19
     D (→):[マイコンボードに書き込む]をクリック
        コンパイル後、書込み実行まで自動的に実施される。

        → ターゲットにはOLED未実装で書込みを行った。
          書込み終了後、RUNして最後の、DEBUG_LED点灯で止まった。明るく赤点灯した。ここまではOK

        → 次に、OLED実装して外部ACアダプターにて動作確認した。
          <結果>
           @ P_ON -> "Start Test !! -> 5秒後 -> Ascii文字表示1 -> 5秒後 -> Ascii文字表示2 -> DEBUG_LED点灯 -> STOP
                       by N.Ishii"
              になるはずが、OLED表示せず、最後のDEBUG_LED点灯のみOK

          <調査開始>
           @ SCKが速過ぎる可能性がある。
              以下のように、現在のソフトSPIでのクロック生成記述にdelayは入れてない。nopでのタイミング調整が必要かも?

digitalWrite(SPI_CLK, HIGH);
d <<= 1;
digitalWrite(SPI_CLK, LOW);

              前pic24fでの例は以下(クロックとデータのタイミング生成部・電池駆動を想定している為クロックスピードを、かなり抑えている)
for (Loop=0;Loop<8;Loop++){
 SPI_DATA = 0;
 if ((d & (unsigned char)0x80) != 0){
   SPI_DATA = 1;
 }
 delay_us(3);
 SPI_CLK = 1;
 d <<= 1;
 delay_us(6);
 SPI_CLK = 0;
}
SPI_CS = 1;

           A 上記に準じて、nopでウエイトを入れてみる。これで実測fck≒ 33kHzになる。
for (Loop=0;Loop<8;Loop++){
  digitalWrite(SPI_DATA, LOW);
 if ((d & (unsigned char)0x80) != 0){
  digitalWrite(SPI_DATA, HIGH);
 }
 Waitx1us(3);
 digitalWrite(SPI_CLK, HIGH);
 d <<= 1;
  Waitx1us(6);
 digitalWrite(SPI_CLK, LOW);
}

<追加:arduinoにuS単位のディレー関数は無いので自前で作成>
void Waitx1us(int x) // Td = 1uS * x
{
  int i;

  for(i = 0 ; i < x ; ++i) {
    /// Td=1000nS(62.5nS x 16) 
    asm("nop \n"); //Td=62.5nS
    asm("nop \n");
    asm("nop \n");
    asm("nop \n");
    asm("nop \n");
    asm("nop \n");
    asm("nop \n");
    asm("nop \n");
    asm("nop \n");
    asm("nop \n");
    asm("nop \n");
    asm("nop \n");
    asm("nop \n");
    asm("nop \n");
    asm("nop \n");
    asm("nop \n");
  }
}


■ 2025.4.21
  ・ソース修正後、コンパイル〜書込みまでokになる。
   まずは、aitrndoの格安OLED:M096P6JKで試す。(実は、PIC24FにロードしたHEXで一度は、そのまま表示したが、10日後位に試したら表示しなくなったOLED)



   もしかしたら表示するかと思ったが、やはり表示しない??
   尚、SSD1306の入力は5Vトレラントでないので、arduinoと接続する場合は、間に74HC4050(非反転バッファIC)を挿入し、入力5V -> 出力3.3Vに変換する必要がある。
   以下に、ちょっと前に作った74HC4050ユニットを示した。尚これに使用した小基板は、aitendo福BOXに入っていた物を使用しました。



   <調査開始>
    @ SCKは、DIGITAL-13に割り当ててるので、これに対応する内部LEDがSCK送出時、点滅しているのが確認出来た。
    A SCK周期は約30uSで、8発出てることが確認出来た。
    B SCK - SDATA 観測 -> OK(180Mオシロ:SINGL TRGで確認 -> 良さそう。
    C CSを見たら、RUN中、Lowぱなし??-> ワイヤリングミス発覚!!:buf-6:3Y - JTAG-3が正しいが、JTAG-4:GNDになってた。
    D JTAG-3に修正しトライ-> CSは変化したが表示せず??
    E CS - SCK 観測 -> OK(180Mオシロ:AUT TRGで確認 -> 良さそう。



    F DC - SCK 観測 -> OLED負荷有だとDC Lowになり切れて無い? oled無負荷だと変化する??->Ossillo V6にて波形取った。


■ 2025.4.23
  ・aitendoのOLEDだが、DC信号ラインが不良の可能性がある。確実に動いているOLED= UG-2864で確認してみる。
   <結果>
    @ 何か動いた。
       最初の、文字列(メッセージ)表示おかしい。
                正しくは、
       "Start Test !!"

                            " by N.Ishii"

       だが、文字化けしてる。ただロケーションは合ってる。
       よく見ると、S -> T, t -> u に化けてる。後の文字も1つズレてる。



       ASCIIテーブルのポインタ指示が一つ先にずれているのか?
       ※ 次の全キャラクタ表示(192文字)は一見良さそう。


■ 2025.4.28
  ・デバッグ続き
   Arduino IDE内蔵の、シリアル・モニタ機能を使って変数の内容を表示させデバッグしてみる。USBケーブル接続必須。
   何を確かめたいか?
   OLED_ROMstr("Start Test !!");を実行した時の、最初のOLED_char(*str);// 文字列1文字出力
   の*str(文字列ポインタの内容)が、'S'であるか? 否か('T'になってるのでは? 以下も1つズレてる?)

   <Arduino IDE内蔵の、シリアル・モニタ機能を使って変数の内容を表示させてのデバッグ方法:WEB情報>
    @ void setup() に Serial.begin(9600);追加
    A 変数表示が必要な箇所に、Serial.println(keyVal);追加
    B プログラムを書き込んで、シリアルモニタを開く。(上部「虫眼鏡」アイコンクリック)

      以下のように試した。

void setup(){
  Serial.begin(9600);
          ・
          ・
}

void loop() {
  OLED_ROMstr("Start Test !!"); // 1stメッセージ
 while(1);
      ・
      ・
}

/******************************
* Rom 文字列出力
* 追加関数:N.Ishii
*******************************/
void OLED_ROMstr(char *str){
  while(*str != 0x00){ // 文字列の終わり判定
  Serial.println(*str);

  OLED_char(*str); // 文字列1文字出力
  str++; // ポインタ+1
  }
}

  ・解明した!!
    void OLED_ROMstr(char *str)関数自体の動きはokだった。
    ちゃんと*strの内容は、"Start Test !!"だった。



   しかし、Ascii文字テーブルにミス有。
   どういう訳かコピー元の文字テーブル:Ascii_font.hに、
    { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , 0x2C
   が抜けてた。
    これで1文字ズレてた。
   Asciiテーブル表示が一見良さそうだったので、okと思い込んでいた。

   ※ 文字テーブル:Ascii_font.hを修正しOKになる。


<回路図>

こちらからどうそ→ ・ARDUINO_OLED実験1 : aitendo格安OLED「
M096P6JK」版
               ・ARDUINO_OLED実験2 : 
UG-2864版

<最終ソース及びヘッダファイル>
 ・こちらから、どうぞ→    ARDUINO_OLED_TEST_1.ino

                    /// アスキーフォント
                    ASCII_font.h

 


← 実験テーマ1に戻る   TOP PAGEに戻る