ワレコ
2022年もArduino UNOやAVRマイコンを使って色んなヘンテコな物を作りたい。
まずは自作オーディオ機器のボリュームをリモコン化したいのだ。
さて、下に示す前回記事ではAVRマイコン(ATmega328P)を単体で使う時に便利な汎用I/O基板とUSBシリアル変換基板をワテが設計してPCBWayさんに発注して六日で配送された過程を紹介した。
当記事では、それらの基板に搭載したATmega328Pマイコンに対してArduino IDEやMicrochip Studioなどの開発ツールを使って、LEDチカチカのプログラミングに成功したので、その詳細を紹介したい。
では、本題に入ろう。
ATmega328P汎用I/O基板とUSBシリアル変換基板を組み立てる
下写真の青基板(秋月AE-UM232R USBシリアル変換モジュール用)と緑基板(ATmega328P汎用I/O基板)にパーツを半田付けした。
写真 下段左から❶秋月AE-UM232R USBシリアル変換モジュールとその❷汎用基板、ATmega328P汎用I/O基板
これらの基板を使って早速LEDチカチカ実験をしてみる。
Arduino IDEを使ってLEDチカチカ成功
まずはArduino IDEを使ってLEDチカチカ実験をやってみる。
下写真のように配線した。
写真 USBシリアル基板(青)、ATmega328P汎用I/O基板(緑)、ATMEL-ICE(白)
上写真の説明
- ACアダプタ(12V3A)から5Vdcを生成(SMD三端子レギュレータ7805)
- ATmega328P左右にある黒色14Pソケットで信号を取り出している
- ATmega328P上部黒色ソケットは5Vdc、下部黒色ソケットはGND
- ATmega328Pの28番ピン(digital pin 19 = PC5) に緑LEDと抵抗を直列にGNDへ接続
- ATmega328P右下のICSP6(3×2列)端子にdebugWireでATMEL-ICEと接続
- ATMEL-ICEはUSB micro-Bでパソコンと接続
- USBシリアル基板はUSB Type-Aでパソコンと接続
Arduion IDEで328Pのボード定義を追加する
まずはArduino IDEにおいて、328Pを単体で使う為の設定を行う。
具体的にはボードマネージャと言う機能を使って328P用の定義ファイルのようなものをインストールすれば良いようだ(ネット情報で)。
下図はその設定作業をやった状態。
図 ボードマネージャを使ってボード定義を追加した
上図に示すようにArduino IDEのツールメニューの中のボードの部分は
ボード:ATmega328/328P
となっている。
Arduino IDEをインストールしたデフォルト状態では「Arduino AVR Boards」のみだ。
それ以外の項目(ATmega Microcontrollers, ATmega Universal など)は手作業で追加した。
追加方法は以下の通り。
環境設定画面を開く(下図)。
図 Arduino IDEの環境設定画面で追加のボードマネージャのURLを追加する
上図において「追加のボードマネージャのURLを追加」と言う項目があるが、その部分にURLを追加すれば良いのだ。
ワテの場合は以下の四つのURLを追加している。
https://kimio-kosaka.github.io/ATMegaCore/package_ATMegaCore_index.json
https://raw.githubusercontent.com/carlosefr/atmega/master/package_carlosefr_atmega_index.json
これらの項目は「ATmega328Pを単体で使う」とか「AVRを単体で使う」などのキーワードでネット検索してヒットしたページを参考にして追加したのだ。
このように「追加のボードマネージャのURLを追加」作業をしたあと、ボードマネージャを開いてそれらのURLのサイトが提供しているボード定義ファイルをインストールすれば良い。
そうすると先ほど示したように
ツール ー> ボード
の項目が追加されるのだ(ATmega Microcontrollers, ATmega Universal など)。
Arduion IDEで328Pにブートローダーを書き込む
さて、以下のように設定した。
プロセッサ:”ATmega328P”
Clock:”Internal 8MHz”
シリアルポート:”COM3″
書込み装置:”Atmel-ICE (AVR)”
このように設定した後で、「ブートローダーを書き込む」を実行してみる(下図)。
図 328P単体ボードにブートローダーの書き込みが完了
その結果、上図のように無事にブートローダーの書き込みに成功した。書き込み作業自体は数秒で終わる。
なお、メッセージが赤色なのでエラーが発生したのかと勘違いするが、これはエラーでは無くて正常なメッセージだ。設定画面で「コンパイラの警告」を「全て」表示する設定にするとこんな風に赤文字で表示されるようだ。
Arduion IDEで328Pにスケッチを書き込む
次はスケッチを書き込む。
スケッチ -> マイコンボードに書き込む
を実行する。あるいは書き込みアイコンクリックでも良い。
図 328P単体ボードにスケッチ書き込みに成功
その結果、上図のように無事にスケッチ書き込みに成功した。
今回書き込んだスケッチは以下の通り。
//#define LED_PIN 13 //digital pin 13 はPB5で19番ピン = SCK //#define LED_PIN 8 //digital pin 8 はPB2で14番ピン #define LED_PIN 19 //digital pin 19 はPC5で28番ピン void setup() { pinMode(LED_PIN, OUTPUT); Serial.begin(2400); // Serial.begin(9600); // Serial.begin(115200);//化けた // Serial.begin(57600);//化けた // Serial.begin(38400);//化けた // Serial.begin(19200);//化けた } void loop() { digitalWrite(LED_PIN, HIGH); delay(100); digitalWrite(LED_PIN, LOW); delay(100); Serial.println("Hello, World"); }
コード 328PでLEDチカチカ実験用スケッチ(28番ピン=PC5=digital pin19が点滅)
100ms点灯、100ms消灯をloop関数内で繰り返している。
Serial.println()を使って文字列をCOM3に出力する部分も無事に動作したぞ(下図)。
図 USBシリアルモジュール経由でArduino IDEのCOM3に文字表示成功
秋月AE-UM232R USBシリアル変換モジュールを載せた青色基板と328P緑基板は6Pのピンヘッダで接続している。
今回の実験では、この配線で無事にArduino IDEのシリアルモニタ画面に文字列を表示する事が出来た。
素晴らしい!
External Clockに切り替わらない?
このようにワテ自作の328P汎用I/O基板とUSBシリアル基板を使ってArduino IDEでいい感じにプログラミングに成功したのだが、一つ未解決問題がある。
それは、現状、
で無事に328Pマイコンは動作したが、外部クロックを使う設定、
も選択可能だ。
ところがこの外部クロックを使う設定でスケッチを書き込むと、LEDチカチカ動作はするのだが、内部クロックで動作しているようだ。
なぜなら、緑基板に取り付けている16MHzの水晶振動子をオシロで計測しても発振していないし、水晶振動子を抜き取ってもLEDチカチカしているので。
どういうこっちゃ!?
ようわからんw
この件は引き続き調査だ。
この記事を書いていて気付いたのだが、内部クロックや外部クロックの切り替えはスケッチ書き込み時ではなくて、ブートローダー書き込み前にそれらの切り替えをやっておく必要があるのだ。
具体的には外部クロック16MHzを選択して、ブートローダーを書き込み成功。そしてスケッチを書き込んだらLEDチカチカ開始。そのあとで水晶発振子を引き抜いたらLEDチカチカ停止。再び水晶発振子を挿し込んだらチカチカ再開。ちゃんと外部クロックが出ているがな。
なんや、そう言う事かw
解決!
Microchip Studioを使ってを使ってLEDチカチカ成功
次はMicrochip Studioを使ってを使ってLEDチカチカを試してみる。
配線は先ほどと全く同じだ。
Interface:ISPでLEDチカチカを試す
まずはInterface:ISPで試す(下図)。
図 Microchip Studioの設定でInterface: ISPを選択する
下に示すLEDチカチカ用のコードを実行した。
図 Microchip Studioで作成したLEDチカチカ用コード
Microchip Studioで作成したこのLEDチカチカ用コードは以下の通り。
/* * main2.c * * Created: 2022/01/11 9:12:10 * Author: wate */ #ifndef F_CPU // if F_CPU was not defined in Project -> Properties #define F_CPU 8000000UL // define it now as 1 MHz unsigned long #endif #include <avr/io.h> // this is always included in AVR programs #include <util/delay.h> // add this to use the delay function #include <stdio.h> #include "usart.h" /////////////////////////////////////////////////////////////////////////////////////////////////// int main(void) { //? usart_init(115200); // 化ける usart_init(9600); // 化ける //? usart_init(2400); // 化ける //? usart_init(600); // 化ける usart_puts("Initializing IR\n"); char debugStr[50] = ""; int i=0; DDRC |= (1 << PC5); // set Port C pin PC5 for output while (1) { // begin infinite loop PORTC ^= (1 << PC5); // flip state of LED on PC5 _delay_ms(500); // delay 1/2 second sprintf(debugStr, "command : %d\n", i++); usart_puts(debugStr); } return(0); // should never get here, this is to prevent a compiler warning }
コード Microchip StudioでLEDチカチカするCプログラム
その結果、328Pの28番ピン(=PC5=Digital Pin19)に挿している発光ダイオードが無事にチカチカしたぞ。エエ感じや。
でも、何故かData Visualizer画面のUSB Serial Portモニタ画面(下図)に表示される文字列が化けている。
図 秋月USBシリアルモジュール経由で読み取ったCOMポートのデータが化けている
正しく動いた場合には、0, 1, 2, 3 … のように数字が表示されるはずなのだが。
文字化けの原因は不明だ。過去の実験の経験で言うと、送信側(328P)と受信側とでシリアル通信速度を揃えておく必要がある。例えば1200bpsなど。
ワテの経験では、送信側と受信側とで速度設定が異なると文字化けした。
また、送信側と受信側で速度を揃えていても115200bpsなどの速い値を採用した場合にも化けた事が有った。
なので今回は送受信ともに1200bpsなどで試したのだがそれでも化ける。
もう訳分からんw
でもまあワテ設計のUSBシリアル基板経由でシリアル通信が出来ているので、文字化け原因が判明すれば大成功の一歩手前と言う感じ(と言う事にしておく)。
Interface:debugWireでLEDチカチカを試す
次はInterface:debugWireに変更してLEDチカチカを試した(下図)。
図 Interface:debugWireに変更した
この設定にしておくと、Cプログラムの各行にブレークポイントを設定してブレークさせる事が出来る。ステップ実行も可能だ。
ところが、実行してみると何かデバッグ関連のエラーメッセージが出て、失敗。
何か良く分からんが色々試してみて、取り敢えずUSBシリアル基板を外したら無事に動作した(下図)。
図 ATMEL-ICEと自作328P汎用I/O基板をdebugWire接続してデバッグ実行成功
上図ではブレークポイントで停止している様子を示す。
なぜUSBシリアルモジュール基板を328P基板に接続するとエラーするのかは調査中だ。
InterfaceのISPとdebugWireを切り替える
と言う訳でMicrochip StudioをdebugWireモードで使う場合には、現状ではUSBシリアルモジュールが使えていない。
この件は引き続き調査中だ。
なお、一旦debugWireモードに入るとISPモードに戻すには以下のように適当な場所でブレークさせて停止しておいて、「Disable debugWire and Close」を実行すると可能だ。
図 「Disable debugWire and Close」を実行すればISPモードに戻せる
まとめ
ワレコ
ワテ設計のATmega328P汎用I/O基板、USBシリアル基板を使ってArduino IDEとMicrochip StudioでLEDチカチカに成功した。
二ヶ月くらい前から開始したAVRマイコン学習だが、独学ながら少しは上達したぞ。
でもまだFUSEビットの設定など良く分かっていない。
設定をミスって使えなくなった328Pも数個ある。あかんがなw
当記事では、ワテ設計のATmega328P汎用I/O基板、USBシリアル基板を使ってArduino IDEとMicrochip StudioでLEDチカチカのやり方を紹介した。
現状ではArduino IDE環境なら、以下の作業が出来る。
- ブートローダーの書き込み成功(ATMEL-ICEで)
- クロック切り替え成功(内部 or 外部)、ブートローダー書き込み時に
- スケッチ書き込み成功(ATMEL-ICEで)
- USBシリアル通信成功
Microchip Studio環境では以下の通り。
- ブートローダーの書き込み成功
- クロック切り替え(内部 or 外部)失敗。FUSEビットを弄ったら使えなくなった328P数個あり
- Interface: ISPモード時にはプログラム書き込み成功(ATMEL-ICEで)
- Interface: ISPモード時にはUSBシリアル通信成功したが文字化け未解決
- Interface: debugWireモードにするとUSBシリアル基板があるとプログラム書き込みエラー
- Interface: debugWireモード時にはUSBシリアル基板外せばプログラム書き込み、デバッグ実行成功
などか。
このようにAVRマイコン実験はかなり進歩したが、上に示した未解決問題も残っている。
あと、現状Arduino IDE 1.8.19を使っているのだがもうすぐリリースされるArduino IDE 2.0ではデバッガーが使えるようになるらしい。
そうなるとMicrochip Studioを使わなくてもArduino IDEで足りるので、そうなればワテ設計328P基板とUSBシリアル基板で、デバッグも出来るし、シリアル通信も出来るので、ワテが理想とするAVRマイコンの開発環境が整う事になるぞ。
試しにArduino IDE 2.0.0-rc3で試してみた(下図)。
図 Arduino IDE 2.0.0-rc3でLEDチカチカを試すがupload error、残念。
その結果、Bootloaderの書き込みは成功したが、LEDチカチカスケッチの書き込みはエラーで失敗。
と言うエラーメッセージが表示されている。
書き込み機(programmer)としてはATMEL-ICEを指定していて、ブートローダーの書き込みはこれで出来たのになぜかスケッチの書き込みが出来ない。
(続く)
コメント