nobcha23の日記

PICマイコンやArduinoを使う電子回路遊びを紹介します

久しぶりにARDUINOで実験をやってみようかと思います

昨年PCがクラッシュし、SSDへ入れ替えてのち、PICマイコン開発の再立ち上げから遠のいていました。ここで、ちょっと目先を変え、着手簡単なARDUINOで試作を進めててみることにしました。

 

0.昔ARDUINO互換基板を買って実験していたことがあり、その基板を出してきました。ところが、この基板のUSBシリアルはあの秋月USBシリアルでトラブったプロリフィックとかのチップであり、つなぐとインストールされる最新ドライバがだめで2014年版ぐらいの古い版を探して入れ替えないといけないとかいうものでした。以前WIN7の時は何とかうまくいったような記憶がありますが、今回はだめでした。あきらめ互換基板を買うことにしました。その後再チャレンジしたら、旧ドライバへの入れ替えでき、チビディーノ基板も戦力になりました)

 

1.アマゾンでARDUINO UNOを買った。日本の倉庫(いつも京都に自転車で行くときに前を通る巨大倉庫?から来たみたいです)からの配送だったので2日目に届いた。

Arduino互換並行輸入品 ロボットプロジェクト 開発ボード 学習ボード (UNO R3改良版)

 

2. ARDUINO1.8.12をダウンロードした。[SOFTWEAR】タブ、「DOWNLOADS」
「Windows Installer, for Windows 7 and up」「Just download]


2.1 中国製互換品なので、CH340 USBシリアルドライバをインストールした。
https://sparks.gogo.co.nz/ch340.html

3. 秋月の ATMEGA168/328用マイコンボード(I/Oボード)の基板だけ利用し、ピンヘッダをはんだ付け、基板の上にミニブレッドボードBB-601(青)を張り付けた、特製ブレッドボードシールドを作った。

これだとすごく安くでっち上げられます。

3.「きむ茶工房ガレージハウス」から”I2CLCD"関連のスケッチとライブラリーを取得。お世話になります。

4.秋月のAQM1602AをARDUINO UNOのANALOG2=SCL, ANALOG3=SDAにつなぐ。


5.スケッチのSETUPで ”LCD.Init(LCD_NOT_ICON,32,LCD_VDD5V) ; //5Vへ変更20200612”
LCD_VDD3V→LCD_VDD5Vその他メッセージも変更、無事表示出ました。

 

6.秋月のロータリーエンコーダーは割り込みを利用したBuxtronixというWebサイトのスケッチを使いました。日本語で説明ならこちら本家はこちらライブラリーはGITHUBでこちら。こちらもお世話になります。

7.両方をマージし、回して割り込みが入るとシリアルポートとLCDにSW LEFT/RIGHT
が表示されるというスケッチを作りました。ところがここでちょっとトラブル。ロータリーエンコーダのチャタリングがかなりひどいらしい?、先輩プログラムでISRルーチンの中でSERIALモニターしていたのをそのままコピペしたのがいけなかったようで、動きません。そこで、外部にプルアップ抵抗を追加したら、ずいぶん安定しました。ARDUINOの説明を読むと、attachInterruptで指定した関数にはdelay関数ダメ、シリアル通信のデータ失われるとあります。

f:id:nobcha23:20200614171656j:plain

ARDUINOで試作再開




>|?|  (はてなダイヤリーの時からのくせで、この編集子を使ってしまいます)


// 20200614_デバッグ完了:AQM1602液晶との接続、ロータリーエンコーダー割り込み(プルアップ抵抗)
#include <Rotary.h>

// I2C接続16文字x2行LCDのテスト
// 秋月電子[AQM1602A](アイコン表示は無しです)
#include <Wire.h>
#include "skI2CLCDlib.h"

// 5x7ドットのハートキャラクタです、1で表示 0で消去
char heart[7] = {
0b01010,
0b11011,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000,
} ;

char i = 0;
unsigned char result = 0;

skI2CLCDlib LCD(0x3E,16) ; // LCDのアドレス、画面カラム数16文字

/*
Rotary encoder test debug scketch
PWM/3: Rotary A
PWM/2: Rotary B
GND: C
*/

#include <rotary.h>
Rotary r = Rotary(2, 3);

void setup()
{
// LCDモジュールの初期化処理
// ICON OFF,コントラスト(0-63),VDD=5Vで使う
LCD.Init(LCD_NOT_ICON,32,LCD_VDD5V) ; //5Vへ変更20200612

LCD.CreateChar(1,heart) ; // 1番にオリジナルキャラクタを登録する

// 0ページ目、1ページ目に書き込む(0ページのみ表示される)
LCD.SetCursor(0,0) ; // 表示位置を1行目1列[00H]に設定
LCD.Puts("AIRBAND RECEIVER") ; // [00H]から書込まれる(表示する)
LCD.SetCursor(16,0) ; // 表示位置を1行目16列[10H]に設定
LCD.Putc(0x01) ; // 1番に登録したキャラを書込む(表示しない)
LCD.SetCursor(0,1) ; // 表示位置を2行目1列[40H]に設定
LCD.Puts("10.7MHz IF ") ; // [40H]から書込まれる(表示する)
LCD.Puts("10.7MHz IF ") ; // [50H]から書込まれる(表示しない)
delay(2000) ;
// 1ページ目に切り替えて表示する
LCD.PageSet(1) ; // 1ページ目の表示切り替え
delay(2000) ;
// 1ページ目を書き換える
LCD.PageClear() ; // 1ページ目のクリア
LCD.PageSetCursor(0,0) ; // 1ページ目の位置でカーソル指示、[10H]に設定
LCD.Puts("Arduino") ; // 1ページ目[10H]から書込まれる(表示する)
delay(2000) ;
// 0ページ目に表示を切り替える
LCD.PageSet(0) ; // 0ページ目の表示切り替え

// Rotary switch port setup
Serial.begin(9600);
// 割り込みセットアップ
PCICR |= (1<< PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
}

// 割り込みではロータリースイッチ起動と周り方向をresultで伝えてもらうことにした。
void loop()
{
if (result) {
Serial.println( result == DIR_CW ? "Right" : "Left");

LCD.PageSetCursor(7,1) ; //カーソル書き込み位置(コラム、行)
LCD.Puts("SW "); //
LCD.Puts( result == DIR_CW ? "Right" : "Left ");
i ++;
LCD.Putc( 0x30 | i & 0x7 );  // 割り込み回数カウンタも表示
result = 0;
}
}

ISR(PCINT2_vect) {
// スイッチを触っただけで割り込むので、プルアップ抵抗追加で少し安定させた
result = r.process();
}

||<

 

8.この実験の目標は以前にPICマイコンで作成したSi5351aを使ったエアバンド用局部発振器のARDUINOへの移植です。


次はSi5351aをつないでみることにしたいが、5V/3.3Vレベル変換器が必要なので、その前にPICマイコンプログラムの移植検討をします。スイッチポーリングをライブラリーにするか、そのまま使うか、Si5351aのi2cをwireで行くかTj Labスタイルで行くかなどの検討中です。

 

rover.ebay.com

www.banggood.com