記事内に広告が含まれています

【ワレコの電子工作】ATmega328P用自作汎用I/OボードでLEDチカチカ – Arduino IDEとMicrochip Studioで【PCBWay発注基板】

この記事は約14分で読めます。
スポンサーリンク

ワレコ

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を追加している。

http://drazzy.com/package_drazzy.com_index.json
https://kimio-kosaka.github.io/ATMegaCore/package_ATMegaCore_index.json
https://raw.githubusercontent.com/carlosefr/atmega/master/package_carlosefr_atmega_index.json
https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json

これらの項目は「ATmega328Pを単体で使う」とか「AVRを単体で使う」などのキーワードでネット検索してヒットしたページを参考にして追加したのだ。

このように「追加のボードマネージャのURLを追加」作業をしたあと、ボードマネージャを開いてそれらのURLのサイトが提供しているボード定義ファイルをインストールすれば良い。

そうすると先ほど示したように

ツール ー> ボード

の項目が追加されるのだ(ATmega Microcontrollers, ATmega Universal など)。

Arduion IDEで328Pにブートローダーを書き込む

さて、以下のように設定した。

ボード:”ATmega328/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でいい感じにプログラミングに成功したのだが、一つ未解決問題がある。

それは、現状、

Clock:”Internal 8MHz”

で無事に328Pマイコンは動作したが、外部クロックを使う設定、

Clock:”External 16MHz”

も選択可能だ。

ところがこの外部クロックを使う設定でスケッチを書き込むと、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チカチカスケッチの書き込みはエラーで失敗。

A programmer is required to upload

と言うエラーメッセージが表示されている。

書き込み機(programmer)としてはATMEL-ICEを指定していて、ブートローダーの書き込みはこれで出来たのになぜかスケッチの書き込みが出来ない。

(続く)

スポンサーリンク
コメント募集

この記事に関して何か質問とか補足など有りましたら、このページ下部にあるコメント欄からお知らせ下さい。

ArduinoAVRDIYHobbyエレクトロニクス半田付け
スポンサーリンク
シェアする
warekoをフォローする
スポンサーリンク

コメント