2015年05月17日

ISPでArduinoを楽しむ W

OLED&ENC.JPG

 WeekDayは、なかなか時間もとれず、注文していた中華製Arduinoの基板もやっと受け取れました。
送ってきた基板は、写真のように1個ずつ静電袋に入れられておりしっかりした梱包でした。注文先はみな違ったのですが、どこも同じような感じです。

写真.JPG

 それぞれの中身の写真も撮ってみました。

UNO.jpg.JPG
UNO
nano.jpg.JPG
nano
mini.jpg.JPG
Pro mini
min2.jpg.JPG
Pro miniは書き込みにUSB-232C変換ボードが必要

 Arduinoでのプログラムは、以前にBASCOM−AVRで作っていたロ−タリーエンコーダーの4倍カウントを移植してみました。書式は、C方式に書き換えましたが、プログラムそのものはそのままで難なく動きました。
 ロータリーエンコーダーも中華製の400パルスのものに変更しましたが、さすがに4倍速(1600パルス)だと1mSのタイマー割り込みでは取りこぼしが多く、100uS割り込みに変更し、うまく動いています。



 表示デバイスも20*2のOLEDのI2C制御を試してみました。こちらも難なくうまく動いています。
 今回の実験で、多くの方々が作られたArduinoのソフトウェア資産を活用させていただければ、新しい周辺デバイスへの対応が簡単に行えることがわかりました。開発ソフトウェアは無料ですし、IPS対応のライターを持っていれば、Arduino専用ボードを買う必要もないし、なかなか良さそうです。
 ちなみに、今回仕入れた中華製Arduino専用ボードの価格を、中華製、aitendo、秋月、千石、マルツで比較してみました。中華製は注文して10日間ほど掛かるのと、リスクがゼロではありませんが結果は、ローカルのOMさんの言われるとおり、中華製の圧倒的パフォーマンスです。当局の場合、これまでそこそこの種類のものを購入しましたが、届かないとか、故障していたことはありませんでした。

Arduino価格比較.jpg

 なお、この比較は、国内販売されている店舗さんを否定しているわけではありませんし、中華製を買いなさいと言っているわけではありませんので念のため!
 当局も、いずれのお店も頻繁に利用させていただいております。
posted by ja6irk at 17:27| Comment(2) | TrackBack(0) | AVR&Arduino

2015年05月06日

ISPでArduinoを楽しむ!V

DSC01125.jpg

普通なら、Arduinoの専用ボードを入手して色々遊んでから、ISP書き込みになるのでしょうが、今回はISP書き込みができることを知って、それを確かめることからはじめました。
今回確認できたことは、Arduinoの沢山あるライブラリを活用するのに専用ボードは必要ないということです。
つまり、普通に売っているATMELのAVRマイコンである、ATmega168やATmega328をそのまま組み込みマイコンとして使用して、基板に乗せたままISPプログラムできるということです。
これまで、BASCOM-AVRで使用してきたプログラムライターである、USBaspやAVRISP、AVRISPmkU等があれば、今までのBASCOM-AVRと同じようにプログラムを書き込むことができるのです。
勿論、ソフトウェアはBASICではなくCをベースにしたものになりますが、ArduinoIDEという開発ソフトは素人にもとっつきやすくできています。そして、驚きは、大概の制御ライブラリはネット上にあふれダウンロードして使うことができます。
当局は、Cが苦手でこれまで実用ソフトを作ったことがありませんでしたが、実質1日でロータリーエンコーダーで回転パルスを入力し、DDSの周波数を可変して、その周波数をLCDに表示するというところまでを作ることができました。
これは、DDS制御や、LCDの制御のライブラリがあったからです。DDSの制御は殆ど4行くらいのプログラムで、必要な周波数の10進数(たとえば7000000Hz)を代入するだけで出力が出てきます。これまでのBASICよりはるかに楽です。LCDも同様です。
更にすばらしいのは、最近流行のI2C制御のLCDの制御や、TFT液晶の制御ライブラリもあります。
DDSの次のオシレータとしてはやりつつある、シリコンラボ社のSi570やSi5351の制御ライブラリもあります。
Si5351は8KHzから150MHzまで3つの独立した周波数の出力を出すことができるICです。しかし、レジスタは100以上もあり、その設定や、周波数の計算は複雑なのですが、ライブラリを使えばいとも簡単に出力を出すことができました。このICは機能が多く使いこなすにはそれなりに勉強が必要ですが、とりあえずVFOとしてDDSの代わりに使う程度なら出来上がってしまいました。

DSC01112.jpg
Si5351ボード
DSC01111.jpg
先日のDDSの変わりにSi5351ボードを駆動したブレッドボード

後先が、逆になってしまったのですが、専用ボードも欲しくなり先週のQRP懇親会で秋葉原に行った時、aitendoのびんぼうでいいのという500円の基板と250円の部品セットと380円の書き込み済マイコンを買ってきました。

DSC01120.jpg

ついでに、999円のカラーTFT液晶も買ってきました。
それを組み立て、サンプルソフトを動かしたのが最初の写真です。一部、表示を書き換えてあります。どこをどう書き換えればどのように表示されるのかは、実際にやってみれば簡単にわかりました。



ポート数は食いますが、自作のTRXでカラーのドットマトリクス表示ができそうです。
自作の楽しみもまた増えるのではないかと期待しています。
ということで、何も目的を決めていなかったのですが突然思いつきで始めた今年のGWの実験は終わりになりました。また、あすから本業に戻ります。

posted by ja6irk at 22:18| Comment(2) | TrackBack(0) | AVR&Arduino

2015年05月02日

ISPでArduinoを楽しむ! U

連休で時間があると一気に進みます。
とりあえず、LCD表示、タイマー割り込みによるロータリーエンコーダーのカウント取り込み、中華製DDS(AD9850)の制御による出力周波数可変まで出来上がりました。

DSC01108.jpg

プログラムの書式など、今までのBASICとは勝手が違い、書式エラーを沢山出しながらでしたが、なんとなく雰囲気がつかめて来ました。
LCD表示、タイマー割り込み、DDS(AD9850)については、サイト検索でライブラリーが見つかり、簡単に実現することができました。特に、DDSのライブラリは中華製DDSの基準クロック125MHzをベースに作ってあり、周波数データとして必要な周波数を10進数で記述するだけで(ex.7000000で7MHzとなる)簡単に出力することができます。途中の計算プログラムを考える必要がありません。

DSC01110.jpg

ローカルのOMさんが言われていた、ライブラリのコピペで簡単にできますよ!が、確かにそうだな〜と言った印象です。
ただ、ロータリーエンコーダーの取り込みのプログラムは自分で作りました。ライブラリは沢山見つかるのですが、殆どが外部割込みによるライブラリです。
当局の経験的には、外部割込みでエンコーダーを使用すると殆どの仕事が割り込み処理になってしまいほかの仕事に影響が出るのと、チャタリングの処理で結構苦労します。(ライブラリにはチャタの処理つきが多いですが)
これまでは、タイマー割り込みでうまく動いていたので今回もそれで作ってみました。割り込みは1mSとしていますが、1回転20パルス程度でしたらもっと遅くても問題は出ないと思います。ただ、今までは4倍速でカウントしていたのですが、今回は4倍速は実現できていません。もう少しソフトのコマンドを勉強しないとダメです。



ライブラリは別になりますが、今回のプログラムを参考のために記載しておきます。
(goto文を多用するなどCライクではありませんがあしからず)
これだけの記述で機能が実現できているよ!という参考程度にお願いします。

/*

The circuit:
* LCD RS pin to digital B0
* LCD Enable pin to digital B1
* LCD D4 pin to digital B2
* LCD D5 pin to digital B3
* LCD D6 pin to digital B4
* LCD D7 pin to digital B5
* LCD R/W pin to ground

*/

// include the library code:
#include
#include
#include

#define enc0 A4
#define enc1 A5

#define led0 A0
#define led1 A1

int enccnt = 0;
int encold = 0;
long fcnt = 7000000;
int intcnt = 0;


// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
EF_AD9850 AD9850(7, 6, 4, 5);// (CLK,F-UP,RST,Data)

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);

pinMode(enc0,INPUT_PULLUP);
pinMode(enc1,INPUT_PULLUP);

pinMode(led0, OUTPUT);
pinMode(led1, OUTPUT);

MsTimer2::set(1, timer2int); // 1ms period
MsTimer2::start();

AD9850.init();
AD9850.reset();
AD9850.wr_serial(0x00, 1000000); //1000000Hz
// initialize serial communications at 115200 bps:
Serial.begin(115200);

}


void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 0);
lcd.print("JN3XBY/1");

lcd.setCursor(9, 0);
// print the number of seconds since reset:
//lcd.print(millis() / 500);
lcd.print("Arduino");

lcd.setCursor(0, 1);
lcd.print("FREQ=");

AD9850.wr_serial(0x00,fcnt);

// lcd.setCursor(0,1);
lcd. print(fcnt);
lcd. print("Hz");

}

//*** Timer2 INT Routine***************************
void timer2int() {

//*** Encoder Count Routine ***
if (digitalRead(enc0) == LOW) {goto ret;}
if (encold == 1) {goto ret1;}
encold = 1;
if (digitalRead(enc1) == HIGH) {fcnt = fcnt + 10;}
if (digitalRead(enc1) == LOW) {fcnt = fcnt -10;}
goto ret1;
ret:
encold = 0;
ret1:
//*******************************

//*** 100mS LED ON/OFF **********
intcnt = intcnt + 1;
if (intcnt < 100){goto ret2;}
static boolean output = HIGH;
digitalWrite(led1, output);
output = !output;
intcnt = 0;
ret2:
//*******************************
;
}
//************************************************
posted by ja6irk at 11:43| Comment(4) | TrackBack(0) | AVR&Arduino

2015年05月01日

ISPでArduinoを楽しむ!

今年も早いものでもう5月です。例年だと玄関先の鈴蘭が綺麗に咲いていたのですが、昨年から東京に移り住んでいるため鈴蘭がどうなっているのか知る由もありません。
この連休はとても穏やかで、むしろ暑いくらいです。
特にやることを決めていたわけでもなかったのですが、何気なくサイトで見つけていた専用ボードを使わなくてもArduinoを使う方法を試してみることにしました。

DSC01105.jpg

もともとArduinoは当局が愛用するAVRを使用しており気にはなっていたのですが、専用ボードとなっておりTRXとか組み込み用として使うにはボードのサイズとか使いにくいな〜とか思っていました。
また使用する言語もCライクな言語で当局にはなかなかなじめないものがありました。
これまではAVRとBASCOM-BASICでなんら不自由を感じていなかったこともあります。
しかし、最近ローカルのOMさんが使い始めておられ、色々を参考アプリが沢山あって便利で簡単だよ!と強力に勧められていました。
確かにWifiアプリやカメラアプリなど自分だけではこなせない難題アプリもあるので、一層気になっていたのも事実です。
そういう状況で見つけたのが、タイトルのように専用ボードではなく、AVRの単体チップにISPで直接書き込んでArduinoを動かそうというものです。
実際は、何も難しいことはなくて、手持ちのAVR(ATmega168や328)と手持ちのライターUSBaspに、ダウンロードしたArduinoIDEに、USBasp用のドライバを組み合わのせるだけで、従来のBASCOM-AVRでやっていた時と全く同じようにAVRチップを組み込み状態(ISP)でプログラムを書き込めるようになりました。

DSC01106.jpg
ALEXPRESSで買っていた200円程度のUSBaspライターとその改造版(どちらも使えた)

これで、何千円もする専用ボードを購入する必要もありませんし、コンパクトに機器を自作することができます。
ここに至る簡単な手順を備忘録として以下に記載しました。

1.ArduinoIDEのダウンロード
 下記サイトから、自分のPCのOSにあったものをダウンロードします。
 ページが開き、すでに100万以上ダウンロードされ更に開発を加速するために寄付をお願いされます。
 試用であれば、JUST DOWNLOADで問題ないでしょう!

 http://www.arduino.cc/en/main/Software

 そしてインストールします。

2.USBasp(ISPライター)のドライバのインストール
 下記サイトからドライバをダウンロードします。

 http://sourceforge.jp/projects/sfnet_libusb-win32/

 zipファイルですので展開して、そのフォルダの中にあるbinの中の inf-wizardを起動します。
 
 inf-wizard1.jpg
 NEXTを押します。
 inf-wizard2.jpg
 USBaspを選択して、NEXTを押します。
 inf-wizard3.jpg
 NEXTを押します。
 inf-wizard4.jpg
 保存を押します。
 inf-wizard5.jpg
 Install NOWを押して完了です。

3.ArduinoIDEを立ち上げます。
 以下、LCDTESTプログラムを書いた状態から、書き込みまでの手順です。

 Arduino IDE.jpg 

 Arduino IDE1.jpg
 ツール>ボード>Arduino Nano を選択します。
 Arduino IDE2.jpg
 ツール>プロセッサ>ATmega168 を選択します。(ATmega168を使用したため)
 Arduino IDE3.jpg 
 ツール>書込装置>USBasp を選択します。
 Arduino IDE4.jpg
 ファイル>書込装置を使って書き込む を選択すると書込みが始まります。

 とりあえず、ISPでの書き込み方とLCDの表示やポートの制御はわかったのですが、タイマー割り込みとか、実用プログラムの作り方はこれからです。休み後半は用があるので、今日辺りで何処までかけるようになるかです。とりあえず頑張ってみます。

※Arduinoは、ハードの壁を低くして色々な機能を実現するというような思想で始められたと理解しております。従って、ISPで組み込みでソフトを含め物作りするというのは、この考え方に反するものなのかもしれませんが、当局は、この考え方に反論しているわけではありませんのご理解ください。
むしろ、ハードの敷居を低くして自作派が増えていることに喜ばしく思っております。
当局的には、Arduinoの成果を借りて自分としてのソフトの敷居が低くなって今までできなかったものができれば良いかな〜と思っております。


posted by ja6irk at 13:10| Comment(4) | TrackBack(0) | AVR&Arduino