2016年12月20日 | 公開。 |
8ビットのArduinoを使って作った回路を、Arduino互換機を自作し、回路基板に内蔵する事により小型化する方法について説明します。
Arduinoを使うと、マイコン制御の回路を簡単に試作できるのが利点ですが、製作した回路は、当然ながらArduinoより大きくなります。またArduino込みの回路の価格も、当然Arduinoよりも高くなります。
ArduinoにはUSB経由でスケッチを書き込む機能など、最終的な作品を利用する際には利用しない回路が内蔵されており、これがArduinoを大きくし、価格を高くする原因となっています。Arduinoの互換機を自分で作り、その際に、最終的な作品で使う機能だけを実装すれば、元々のArduinoよりも小型で安価なマイコンを作る事も可能です。
この連載では、Arduinoの互換回路を回路に組み込んで、作品を小型化あるいはコストダウンする方法について説明します。
漠然とArduinoを使った回路の小型化の方法を説明しても、説明が抽象的になって分かりにくくなりますので、何か適当なArduino応用回路を例に挙げ、その回路を小型化する方法について説明する事にします。
なるべく簡単で動作が理解しやすく、かつ実用性のある回路という事で、次の動画と写真に示す様な電子サイコロを作りました。この連載では、この電子サイコロを改良し、小型化やコストダウンしていきます。
この電子サイコロはArduino Unoに、ユニバーサル基板上にサイコロの目の表示用のLEDとサイコロを振るためのスイッチを実装した物を接続して作ってあります。本来は、ユニバーサル基板ではなくブレッドボードで回路を組みたかったのですが、ユニバーサル基板では同じ列に複数のLEDを配置すると電気的に並列接続になってしまい、うまくサイコロの目状にLEDを配置できなかったため、ユニバーサル基板を使って回路を作りました。
製作した電子サイコロの回路図を図1に、作った基板の写真を写真2と写真3に示します。
電子サイコロのスケッチをリスト1に示します。
void display(int n)
{
switch(n) {
case 0:
digitalWrite(2,LOW );
digitalWrite(3,LOW );
digitalWrite(4,LOW );
digitalWrite(5,HIGH);
break;
case 1:
digitalWrite(2,HIGH);
digitalWrite(3,LOW );
digitalWrite(4,LOW );
digitalWrite(5,LOW );
break;
case 2:
digitalWrite(2,HIGH);
digitalWrite(3,LOW );
digitalWrite(4,LOW );
digitalWrite(5,HIGH);
break;
case 3:
digitalWrite(2,HIGH);
digitalWrite(3,LOW );
digitalWrite(4,HIGH);
digitalWrite(5,LOW );
break;
case 4:
digitalWrite(2,HIGH);
digitalWrite(3,LOW );
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
break;
case 5:
default:
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,LOW );
break;
} // switch
} // display
void setup()
{
// used pins
pinMode( 2,OUTPUT ); // LED A
pinMode( 3,OUTPUT ); // LED B
pinMode( 4,OUTPUT ); // LED C
pinMode( 5,OUTPUT ); // LED D
pinMode( 6,INPUT_PULLUP); // switch
// unused pins
pinMode( 0,INPUT_PULLUP);
pinMode( 1,INPUT_PULLUP);
pinMode( 7,INPUT_PULLUP);
pinMode( 8,INPUT_PULLUP);
pinMode( 9,INPUT_PULLUP);
pinMode(10,INPUT_PULLUP);
pinMode(11,INPUT_PULLUP);
pinMode(12,INPUT_PULLUP);
pinMode(13,INPUT_PULLUP);
pinMode(A0,INPUT_PULLUP);
pinMode(A1,INPUT_PULLUP);
pinMode(A2,INPUT_PULLUP);
pinMode(A3,INPUT_PULLUP);
pinMode(A4,INPUT_PULLUP);
pinMode(A5,INPUT_PULLUP);
display(0);
} // setup
void loop()
{
static int pip=0;
delay(8);
if(digitalRead(6)==LOW) {
pip++;
if(pip>=6) pip=0;
display(pip);
} // if
} // loop
製作した電子サイコロの動作について簡単に説明しておきます。
電子サイコロの7つのLEDの配置を図2に示します。各LEDに、それぞれa、b、c、d、a'、b'、c'という記号を付けました。
1~6の各目が出た時の発光パターンを図3に示します。
この図を見れば分かりますが、aのLEDが発光している時は、a'のLEDも必ず発光しています。逆にaのLEDが発光していない時は、a'のLEDも必ず発光していません。このことから、aのLEDとa'のLEDは、ひとつのI/Oピンで制御できる事が分かります。
同様の理由で、bとb'のLED、およびcとc'のLEDの組み合わせも、それぞれひとつのI/Oピンで制御できます。よって、7つのLEDは合計4つのI/Oピンで制御できます。
スイッチに使うひとつのI/Oピンを含めて、全体で5つのI/Oピンが必要な事が分かります。図1の回路図を見て分かる様に、2番ピンから6番ピンまで、5つのArduinoのI/Oピンを使っています。
スイッチのボタンを押している間は、1、2、3、4、5、6、1、2、…と循環的に次々と目を表示し、ボタンから指を話すと表示が停止します。目の切り替えの時間をある程度速くすると、出る目がランダムになり、サイコロとして使用できる様になります。リスト1では、表示が変わっている様子が分かる事と目がランダムになる事のバランスを考えて、目を切り替える際に、delay関数で8msの時間をおいています。
次のページでは、Arduino互換機の基本的な回路について説明します。
商品名 | Arduino Uno用ブートローダスケッチライタシールドキット | |
税抜き小売価格 | 1440円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino Uno用ブートローダライタシールドキットサポートページ |
商品名 | Arduino用ブートローダ/スケッチライタキット | |
税抜き小売価格 | 3000円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino用ブートローダ/スケッチライタキットサポートページ |
商品名 | Arduino用ブートローダ/スケッチライタ(完成品) | |
税抜き小売価格 | 3600円 | |
販売店 | スイッチサイエンス マルツ | |
サポートページ | Arduino用ブートローダ/スケッチライタ(完成品)サポートページ |