2015年5月22日金曜日

単純シリアル出力装置のコード

以下コード表示テスト
以前に書いた単純シリアル出力装置プロジェクトのサンプルコード
EEPROMへのコマンド書き込みが可能

プロジェクトの作例


短いコードなので説明は割愛
どこかからのコピペが混じってると思う

  
#include <EEPROM.h>

const int buttonPin = A0;
const int ledPin1 = 13;

int eepWriteFlag = 0;
int eepAddr = 0;

int buttonState = 0;
int setupFlag = 0;

char str[64]; // 数字(文字列)の受信用配列  
char str2[64];

void setup(){
  int i;
  
  pinMode(ledPin1, OUTPUT);      
  pinMode(buttonPin, INPUT_PULLUP);    
  
  delay(100);
  
  //ボタン押しっぱなし起動→セットアップモード
  if(digitalRead(buttonPin) == LOW)
  {
    //セットアップモード:9600pps固定
    setupFlag = 1;
    Serial.begin(9600);
    Serial.println("Setup Mode");
  }
  else
  {
    //非セットアップモード
    //先頭に記述されている#pps XXXX よりシリアル接続
    eepAddr = 0;

    for(i = 0; i < 64; i++)
    {
      str[i] = (char)EEPROM.read(eepAddr);
      eepAddr++;
  
      if(str[i] == '\r')
        break;
    }
    if(strEq(str, "#pps"))
    {
      long ppsBuf;
      for(i = 0; i < 64; i++)
      {
        str2[i] = 0;
      }
      for(i = 0; i < 64; i++)
      {
        if(str[i+5] == '\r')
          break;

        str2[i] = str[i+5];      
      }
      ppsBuf = atol(str2);
      Serial.begin(ppsBuf);

      Serial.print("pps:");
      Serial.print(ppsBuf);
      Serial.println();        
    }
    else
    {
      Serial.begin(9600);
      Serial.println("pps readError");
    }
  }
}

void loop(){
  int i, j;
  if(setupFlag == 0)
  {
    buttonState = digitalRead(buttonPin);

    if (buttonState == LOW) {     
    // turn LED on:    
    digitalWrite(ledPin1, HIGH);
    
    serialOut(0);
    
    digitalWrite(ledPin1, LOW);
    }
  } 
  else
  {
    //ミソはバッファクリア―!
    for(i = 0; i < 64; i++)
     str[i] = 0;
     
    recvStr(str);  
    Serial.println(str);
    
    if(strEq(str, "#start"))
    {
      Serial.println("detect #start");
      eepWriteFlag = 1;
    }
    else if(strEq(str, "#end"))
    {
      Serial.println("detect #end");
      eepWriteFlag = 0;
  
      EEPROM.write(eepAddr, (byte)'\n');
      eepAddr = 0;
    }
    else if(strEq(str, "#read"))
    {
      Serial.println("detect #read");
      eepAddr = 0;
  
      for(j = 0; j < 512; j++)
      {
        for(i = 0; i < 64; i++)
        {
          str[i] = 0;
        }
        for(i = 0; i < 64; i++)
        {
          str[i] = (char)EEPROM.read(eepAddr);
          eepAddr++;
      
          if(str[i] == '\r')
            break;
        }
        Serial.println(str);
        if(str[0] == '\n')
           break;
      }
    }
    else if(strEq(str, "#clear"))
    {
      Serial.println("detect #clear");
      for(i = 0; i < 1024; i++)
      {
        eepWriteFlag = 0;
        eepAddr = 0;
    
        EEPROM.write(i, 0);
      }
    }
    else if(strEq(str, "#go"))
    {
      //#readとの違いはディレイやppsなど一部パースすること
      Serial.println("detect #go");
      eepAddr = 0;
      
      serialOut(1);
    }  
    else if(eepWriteFlag)
    {
      for(i = 0; i < 64; i++)
      {
        EEPROM.write(eepAddr, (byte)str[i]);
        eepAddr++;
        if(str[i] == '\r')
          break;
      }
    }
  }
}

//※文字列*baseStrの冒頭が*headStrと等しいかどうかをチェックする
//等しければ1、そうでなければ0
int strEq(char *checkStr, char *headStr)
{
  int size = sizeof(headStr) / sizeof(headStr[0]);
  int i;
  int ret = 1;
  
  for(i = 0; i < size; i++)
  {
    if(checkStr[i] != headStr[i])
    {
      ret = 0;
      break;
    }
  }
  
  return ret;
}

void recvStr(char *buf)
{
  int i = 0;
  char c;
  while (1) {
    if (Serial.available()) {
      c = Serial.read();
      buf[i] = c;
      if (c == '\r') break;
      i++;
    }
  }
  buf[i] = '\r';
} 

void serialOut(int debugFlag)
{
  int i,j;
  eepAddr = 0;

  for(j = 0; j < 16; j++)
  {
    for(i = 0; i < 64; i++)
    {
       str[i] = 0;
    }

    for(i = 0; i < 64; i++)
    {
      str[i] = (char)EEPROM.read(eepAddr);
      eepAddr++;
  
      if(str[i] == '\r')
      {
        break;
      }
    }
    
    if(strEq(str, "#delay"))
    {
      int delayBuf;
      for(i = 0; i < 64; i++)
      {
        str2[i] = 0;
      }
      for(i = 0; i < 64; i++)
      {
        if(str[i+7] == '\r')
          break;

        str2[i] = str[i+7];      
      }
      delayBuf = atoi(str2);
      
      if(debugFlag)
      {
        Serial.print("delay:");
        Serial.print(delayBuf);
        Serial.println();
      }
      else
      {
        delay(delayBuf);
      }
    }
    else if(strEq(str, "#pps"))
    {
      if(debugFlag)
      {
        Serial.println("pps Skip");        
      }
    }
    else
    {
      Serial.println(str);
    }
    if(str[0] == '\n')
       break;
  }
}



2015年5月20日水曜日

Arduinoプロジェクト:単純シリアル​出力装置

背景:
 組み込み開発などでRS-232Cポート経由でテストコマンドを叩く機会は多い
 しかし第三者(メカ担当者など)にこれを行わせるのは難しい

  ・PCにターミナルソフトをインストールさせ
  ・USB-シリアル変換コネクタを貸出し
  ・ターミナルソフトの設定を行い
  ・コマンドの入力方法を説明…

 考えるだけでも吐きそう
 ボタンを押したらコマンドが出る箱があればいいのに


装置の概要:
 RS-232Cコネクタが生えている箱状の装置
 箱のボタンを押すとプリセットされたコマンドがシリアルポートに出力される
 電源供給はUSBポートから行うものとする(電源のみ、データ通信なし)


材料(と予算):
 ・Arduino Uno(3000円)
        シリアル通信とGPIOしか用いないのでUnoでなくともよい
    ATmega328P単体でもよい
    その場合は電源コネクタを適宜追加すること
 ・タクトスイッチ(10円~)
        押したら導通するものならなんでもよい
 ・線材(?円)
        なんでもよい
 ・箱(?円)
        Arduinoが入れば何でもよい
        100均のタッパとか
 ・D-sub9ピンコネクタ(オスorメス)(50円~)
        対象との接続にRS-232Cケーブルを用いるならばオス、直接接続するならばメス
 ・D-sub9ピンコネクタシェル(50円~)
        AE-ADM3202が内蔵できるサイズであること
 ・5V-RS-232CレベルコンバータAE-ADM3202(500円)
        安くすませるなら他のコンバータに置き換えること
 ・ケーブル用線材
        束ねたシールド線を用いるならば4線以上


制作方法(ハード):
 使用するのは以下のポートのみ
 ・TX
 ・RX
 ・GND
 ・A0(GPIOポートならばどこでもよい)
 ・5V

 ボタン入力部:
  ボタンの片側の端子をGNDに結線
  もう片側の端子をA0ポートに結線

 RS-232Cコネクタ部:
  TX、RX、GND、5Vをケーブル経由でAE-ADM3202に結線
  AE-ADM3202をシリアル9ピンコネクタに結線(直接はんだ付けも可能)
  シリアル9ピンコネクタをシェルに格納

  ※シェルは箱から出すのでケーブル長を考えること
   見栄えを良くしたいならば箱にケーブル用の穴を開け、ケーブルを通した状態で結線すること
  ※シリアルのレベルによってAE-ADM3202のディップ設定を変えること

 アセンブル:
  Arduinoを箱に収める
  箱に穴を開けてボタンを取り付ける
  箱に穴を開けてRS-232Cコネクタ引きずりだす
  USBケーブルの穴を開ける


制作方法(ソフト):

        制作方法(ソフト):
                セットアップ部で以下の設定を行う
                        シリアル通信の設定(ボーレート程度でOK)
                        A0ポートをプルアップして入力ポートに設定

                メインループ内でA0ポートのチェックを行う
                        ボタンが押される=ポートがGNDに接続される=Lレベル
                        ボタンが離される=ポートは浮く=プルアップされているのでHレベル

                ボタンが押された場合にシリアルポートにテストコマンドを出力

        機能の拡張:
                ・ボタンを増やす
                 ボタンを増やすことで出力コマンドを増やすことができる
                ・コマンドを変更可能にする
                 EEPROMに数百バイトの不揮発領域があるため、コマンドを記憶させるには十分な領域
                 ターミナル経由で書き換えられるようにすればビルドをし直す必要はなくなる




作例:ボタン1個タイプ/Arduinoはびんぼうでいいのを使用


秋月電子での個人的なおススメ商品

以下秋月での一押し商品

・スチロールケースK-12
 Arduino Unoのケースとして多用している
 ブレッドボード基板(後述)もぴったり入る


ArduinoUnoを入れた場合/蓋も閉まる


・片面ガラス・ユニバーサル基板(ブレッドボード配線パターンタイプ)
 ブレッドボードで作ったプロトタイプを基板に起こす時に使う
 小型化の必要が無い場合にこれを使うのが一番楽

基板をK-12に収めた場合/固定にはプラネジ使用


・3mmプラネジ+プラナット
 基板の固定などに多用する
 ナットは1枚余分にかませばスペーサ―代わりにちょうど良い
 ついでに模型用の3mmドリルを購入しておくとよい

垂直取付用ブロック
 基板を直角に立てるときに使用
 タミヤのユニバーサルアームと組み合わせることでどんな構造でも簡単に組める
 穴の数が2つのものと3つのものがある
 3つのものを使うと箱も組める

・FT232 USB-シリアル変換ケーブル VE488
 USB―RS-232C変換
 FT232RLを使ってこの価格は凄い(単品買いで300円くらい)
 他のを買う気が無くなるレベル

・超小型USBシリアル変換モジュール
 最小サイズでのUSB―シリアル変換モジュール
 これまた安い
 シリアルポートにこれをはんだ付けするだけでPCと通信できる
 DTRピンが無いのでArduinoへのスケッチ書き込みには使えない

・3V・3.3V・5V系-RS232レベル変換基板
 シリアル(5V/3.3V)―RS-232C変換
 D-Subコネクタに挟みこめ、コネクタシェルに入る逸品
 ただし高い
 コネクタとシェルを用意するだけで変換ケーブルができる

D-Subコネクタに収めた場合





//**********↓このコメントを消すと何故か動かなくなる!絶対消すな!↓*********

以下は実際に遭遇したトラブル案件

症状:
 コメント行を消すとプログラムが正常に動作しなくなる

環境:
 言語はC
 IDEは存在せずエディタを使用
 組み込み用マイコンのコンパイラを用いてコマンドラインからビル

原因:
 コメントに2バイト文字(日本語)を使用したため、コンパイラのバグでコメント行の改行記号が無視された

 ・エディタ上はこういう記述
   //**********↓このコメントを消すと何故か動かなくなる!絶対消すな!↓*********
        //※※ほげほげ関数※※
        ret = hogefunc(hoge1, hoge2);

 ・コンパイラの理解
   //**********↓このコメントを消すと何故か動かなくなる!絶対消すな!↓*********
        //※※ほげほげ関数※ 蝦ret = hogefunc(hoge1, hoge2);
 (※も蝦も実際には別の文字だが失念)

 蝦は※の2バイト目と改行記号\nが合体してしまった無意味な2バイト文字
  ・※の1バイト目が単体で有意な1バイト文字として解釈された
  ・※の2バイト目+改行文字(\n)が有意な2バイト文字(蝦)として解釈された

 コメント行の次の行で呼んでいるhogefunc()にバグがあり、この関数が呼ばれると正常動作しなかった
 コメント行に巻き込まれたことによってhogefunc()が呼ばれなくなり、表面上正常動作していた
 (実際は設計上の動作ではない/たまたまhogefunc()が重要度の低い処理であったので表面上わからなかっただけ)


備考:
 コンパイラのバグと設計のバグが重なって原因をわかりにくくした
 デバッガが使えない環境だったので泥沼になった

2015年5月19日火曜日

aitendoのArduino関連商品

びんぼうでいいの 
 Atmega328Pの単独動作用基板として考えても安い
 めったにクロックダウンはしないのでクリスタル付きの方がよいがどうやらこちらは販売終了の模様
 部品パックにもクリスタルは付属しないので注意


びんぼうでいいの/商品はこの状態


細々した部品がパックになっているのは便利


・液晶シールド △
 マイクロSDソケットが付いてくる場合が多い
 頻繁にモデルチェンジするため継続的な入手に難がある


・ブートローダライタキット ○
 専用基板が付いてきてこの価格は素晴らしい
 単純なパターンなので間違いも無い
 完成品ではなくキットなのも逆に嬉しい

ゼロプレッシャーソケットタイプ


・LCDキーパッドシールド ×
 バックライトから光が漏れるタイプなので剥き出しで使うとすごくまぶしい
 青背景白抜き文字も見辛い
 LCDユニット依存の話なので、同様のユニットを使っていれば他所のシールドでも一緒
 LCDはケチらずにまともなものを買うべき


・シールド類 △
 だいたい市価の2/3前後で互換シールドが売られている
 ロガーシールド、プロトタイプシールド、センサシールドなど
 価格は素晴らしいのだがデキも価格なり


おまけ:Arduino関連以外

・LCD、液晶ユニット類 △
 とにかく安いがモデルチェンジが早すぎる
 動作実績があってもその液晶をまた買える保証が無い
 毎回博打になるので複数個買いしてストックしておくか?

・FFC、コネクタ、ハウジング類 ○
 他所でまず扱いが無いものを扱っている
 ケーブルアセンブリやコネクタ圧着済での販売があるのもよい(精度的には怖いが)

・電源モジュール等 ×
 ここの品質でリスクのあるパーツは避けるべき
 (メーカーが明示されているものはOK)

2015/07/15追記:
 その2もあります
 びんぼうでいいのよりさらに安いAVR動作基板が登場

ArduinoのTIPS

・外部スイッチとのミニマムな構成
 入力ピンをプルアップ設定する
 スイッチの片側をGNDに、もう一方を入力ピンに接続する
  スイッチを押す:L
  スイッチを離す:H
 として検知できる
 抵抗は不要


・外部LEDとのミニマムな構成
 PinD13のみ内部抵抗が存在するため、LEDを直挿ししても正常動作する
  追記:Uno R3(Revision 3)から構造が異なるため、直挿しはやめた方がよい


Uno R2(Revision 2)の回路図より抜粋:D13ピンに抵抗とLEDを直付け

Uno R3の回路図より抜粋:D13ピン(SCK)からオペアンプ経由で抵抗とLEDを接続



・テスト環境のDIP化
 テスト環境/プロトタイプ構築のためにブレッドボードが用いられる
 各種コネクタには大抵DIP化キットが存在するため準備しておくとよい


・PCとの通信
 シリアル通信で行うのが一番楽
 PCとArduinoをUSB接続してやると自動的にシリアルポートが生成される
 あとはテキスト形式で任意フォーマットの入出力を行えばよい


・外部スイッチのON/OFFについて
 リレーを用いることで、外部機器のスイッチを制御することができる
 スイッチ間の信号が3.3V、5V程度ならば光学リレーフォトカプラ/フォトリレー)が安価かつ静かでよい
 ただし制御信号に抵抗を挟むのを忘れると簡単に壊れる(内部のLEDが焼切れる)ため注意
 ソケットを付けて交換可能にしておくとよい


・外部機器のキーボード/ジョイパッド操作
 USBキーボードエミュレーションなど様々な方法があるが、市販のUSBキーボード/GPIO変換モジュールを使うのが一番楽
  ビットトレードワン/REVIVE USB
 12本のピンに任意キーを設定することができる
 REVIVE USBのピンに対してArduinoのデジタルピンを接続してやるだけでよい

REVIVE USB/市販品を使うのが一番楽


Arduinoシリアル出力について

・シリアル入出力について
 Arduinoのシリアル入出力は内部で二分岐され
  ・TX/RXピン
  ・内部のUSB-シリアル変換機(Atmega16U2)
 に接続される

 排他処理はされておらず単純な二分岐
 ArduinoIDEでUSB経由のファームアップ時、TX/RXを接続しているとエラーが起こる場合がある
 一時的にTX/RXの接続を切ること


・RS-232C接続について
 TX/RXに市販のレベルコンバータを用いればOK
  RS-232Cのレベルはだいたい15V程度

秋月電子のレベルコンバータAE-ADM3202/D-Sub9ピンコネクタに接続した例


・RS-232Cケーブルについて
 ストレートケーブルとクロス(リバース)ケーブルが存在するので注意
  TX/RX端子をそのまま接続するのがストレートケーブル
  TX/RX端子をクロスして接続するのがクロスケーブル
 外観ではわかり辛いので製番で検索したりテスターを使おう


・Bluetoothとの接続について
 市販のBluetoothモジュールを用いることで、シリアル入出力を簡単に無線化できる
 TX/RX端子をモジュールに接続し、SPP(シリアルポートプロトコル)変換を行う
 適宜レベル変換を入れること
 技適証明の無い海外モジュールを使うと電波法に抵触するので避けること

2015年5月17日日曜日

ATmega328P単体動作について

最低限必要なもの:
 ・セラミックコンデンサ
   0.1uF×2
   22pF ×2
 ・クリスタル(水晶発振子)
   16Mhz×1

 配線は割愛(ググろう)
 上記部品および5V電源に接続すれば単体動作可能

あった方がよいもの:
 ・ICソケット(28P)
  意外とAVRの取り外し/交換する機会が多い
  完成済みのプロジェクトを複製するのでなければソケットを使うこと
  書き込み機やAVRのテスターなど頻繁に抜き差しを行う場合は
  ゼロプレッシャーソケットを用いること

 ・リセットスイッチ
  適当なタクトスイッチと適当な抵抗(10kΩ程度)
  起動が不安定だったり頻繁にリセットが必要なプロジェクトに

 ・LED
  UNOはPinD13にLEDが接続されている
  テスト動作によく用いられるBlink(Lチカ)プログラムなどにも用いられるためあると便利
  このピンのみ内部抵抗があるため抵抗をはさまなくてもよい
    追記:AVR単体動作なのでArduinoの内部抵抗は無いです
  高輝度LEDを使うとまぶしくてウザいので止めよう

 ・USBコネクタ(Bタイプメス)
  5Vを取るにはUSB接続するのが一番楽
  miniBやmicroBの方が便利ではあるが基板への取り付けが難しい
  Bタイプであれば2.54ピッチ基板へそのまま半田付けが可能
  必要なのは5VとGNDのみなのでデータピンは折ること
  miniBやmicroBをどうしても使いたい場合はDIP化基板を使うと楽(高いが)

  ※過電流が発生した場合に電源/AVRが破損する場合があることに注意
   AVRが壊れるのは数百円の損失だが、PCのUSBコネクタが破損したら大損害である
   過電流の恐れがあるプロジェクトはポリスイッチなどを使って対策をするか
   ACアダプタタイプのUSB電源を用いること
   
 ・ブートローダーの書き込み環境
  ATmega328PをArduinoとして用いるためにはブートローダーの書き込みが必要
  書き込み済のATmega328Pを買う手もあるが割高
  市販のAVRライタを買うかArduinoUnoのプロジェクトで書き込み環境を構築可能


作例1:最小限構成/クリスタルは22pFコンデンサ上の2ピンに挿す

作例2:給電用のUSBコネクタ、リセットスイッチ、RS-232C変換ICを追加

作例3:ピンソケットをゼロプレッシャーソケットに変更

2015/07/15追記:
 aitendoから安価な単体動作用基板出てます

 部品買ったら基板が付いてきた、レベルの安さなのでおススメ
  

2015年5月16日土曜日

Arduino周辺アイテムについて

ArduinoUnoプロジェクト開発に便利なモノのメモ

・短いUSBケーブル(A-B)
 ArduinoUnoは軽いためUSBケーブルのしなりに負けてあちこち動いてしまう
 開発時はこれがめっちゃウザい
 市販のUSBA-Bケーブルはたいてい1mからなので不便
 短いものがあれば買っておこう

・スイッチケーブル(電源)
・スイッチケーブル(USB)
 Arduinoには電源スイッチが無い
 未使用時に通電するのがウザい場合にスイッチケーブルがあるととても便利
 (リンク先のUSBスイッチケーブルはデータ線が繋がっていないので注意)
 スイッチ付USBハブもよいが、ハブ経由だと供給される電流に制限があることに注意

・保管用ケース
 秋月のスチロールケースK-12がArduinoUnoにジャストフィットする
   Arduino Uno  53.3×68.6×15.4mm
   K-12      53×83×15mm(内寸)
 スペック上は入らないのだが、K-12は開口部から台形状に狭くなっているため
 Arduinoを裏返して入れると本当にギリギリ入る

 Arduinoの横幅に対してケースの横幅(内寸)が僅かに不足するため
 基板を軽く押し込んでやるとケースの弾力でArduinoが固定される(この状態で蓋も閉まる)

 工作でUSB端子用の穴を空けてやれば保管用といわず動作可能なケースとなる
 市販のUno用ケースが1000円前後するのに対してK-12はわずか80円である
 ただし材質のポリスチレンはヒビが入りやすいので慎重に工作すること
 切削が面倒ならばヒートナイフや半田ごてで焼き切ってしまうのもよい

K-12とArduinoUno

逆さにすると本当にギリギリ入る

蓋も閉まる

USBを開口した作例:やすりで仕上げてもこの程度


・ブレッドボード
・ジャンパ線(ジャンパーコード)(オスーオス)
 Arduinoのピンソケットはブレッドボードと同じく2.54mmピッチ
 テスト用の回路を組む場合はブレッドボードがとても便利
 注意したいのはジャンパ線の端子部分の大きさ
 安いジャンパ線はここが太い(
 ピンソケットに挿す場合に隣のジャンパ線と干渉してうまく挿さらない(端子を曲げる必要がある)
 高いジャンパ線はここが細いためとても使いやすい(
 予算が許すならば高い方を買おう

・プロトタイピングシールド
 空のシールドに小さなブレッドボードを載せたもの
 地味に便利
 ちょっとした回路や電子パーツの追加ならばこれで十分


 

Arduino Unoと互換機について

Arduino Unoおよびその互換機についてのメモ

Arduino Uno
 純正なので一番安心できる
 これで動かなければプロジェクト側が悪い
 ただし3000円前半と結構いいお値段である
 
 最新はRevision3(R3)である
 また、SMD版(AVRが表面実装)が存在するがあえて選ぶ理由はない
 AVRを差し替えられる通常版の方が使い道が多く、安心できる

 外部電源が必要な場合は以下に適合するACアダプタを準備すること
  ・内径2.1mm、外径5.5mm、センタープラス
  ・出力電圧7~12V
 (Arduinoを販売する店ならばArduino用のACアダプタください!でOK)

Arduino Uno/安心の純正


サインスマートUno互換ボード
 メジャーな互換機
 だいたい純正の2/3程度であり機能的な差も無い
 Amazonで取り扱いがあるのも便利でよい
 
サインスマート互換機/財布にやさしい


Studuino (スタディーノ)
 かなり毛色の違った互換機
 基板上にサーボ用のピンと4つのタクトスイッチがあるのが特徴
 サーボ用ピンの3.3Vは外部電源入力と繋がっていることに注意
 (USB接続のみで使用する場合は供給されない)
 8Mhz、3.3V動作するためUnoプロジェクトを使う場合には修正が必要

アーテック製スタディーノ/周辺機器の商品展開がある


・びんぼうでいいの
 衝撃的なネーミングと衝撃的な価格
 Uno互換機の基板部分のみであることに注意
 コネクタ、スイッチ、ピン、AVR等は別売(部品パック
 AVR+びんぼうでいいの(基板)+部品パックでUno互換機となる
 上記組み合わせで1000円を切るのはかなりリーズナブル
 (ただし品質も相応/パッと見でも半田付けが粗いのがわかる)

 クリスタルが実装済みのU3と未実装のU3Rがある
 また、USB-シリアル変換がCH340Tなるマイナーチップが使われており
 このドライバをPCに導入するのはややためらわれるところ

びんぼうでいいの/画像は部品パックとAVR、クリスタルを組み付けたイメージ


 

arduinoについて

Arduinoとは
 AVRを用いたワンボードマイコン+開発環境
 シールドと呼ばれる拡張基板によってさまざまな機能を追加できる
 さまざまなプロジェクトが公開されている


・何ができる?
 デジタル/アナログIOポートの入出力やシリアル入出力
 電子部品と組み合わせることで以下のようなことができる
  ・ボタンの押し下げを検知する
  ・DCモータの回転を制御する
  ・LEDを点滅させる
  ・LCDに文字を表示する
  ・小さな液晶にグラフィックを表示させる
  ・SDカードの読み書きを行う
   etc・・・


・Arduinoのバリエーション
 Arduinoはオープンハードウェアであり、公式/非公式のバリエーションが大量にある

 
・何を買えばいい?
 Arduino Uno が一番メジャー
 公開されているプロジェクトの数も一番多いため、用途が特に決まっていなければこれを買うべき
 財布の負担を減らしたければ純正ではなく互換機を選ぶのもよい
 (互換機の例:サインスマート UNO R3

Arduino Uno/単にArduinoという場合はこれを指すことが多い


・Raspberry Piとどう違うのか?
 Raspberry PiはGPIOの使えるLinuxPCみたいなもの
 Arduinoより遥かにパワフルだがOS上で動作するためリアルタイム動作の保証が難しい
 ArduinoはAVRマイコンに直接プログラミングするためリアルタイム動作を実現しやすい
 また、AVRマイコン単体でも動作可能であるため、Arduinoで作ったプロトタイプを安価に切り出すことができる
 (Arduino Unoが3000円程度、Unoに搭載されているAVRマイコン(ATmega328P)は250円程度)

 

電子部品の入手方法(ネット通販編)

電子部品の販売店は皆ネット通販に力を入れており、今や実店舗に出向く必要は殆どない
以下は個人的によく用いる販売サイトのメモである(2015/05現在)

秋月電子
 だいたいここで必要なものの8割は揃う
 価格もリーズナブルでオリジナルキットも多い
 売れ線にラインナップを絞る傾向があるため、新製品やマイナーパーツなどにはやや弱い

千石電商
 秋月よりも商品数が多い
 圧着コネクタやハウジングなどを探すならこっち
 価格ではやや劣る(イメージ)

スイッチサイエンス
 ArduinoやRaspberry Piなどボードマイコンに強い
 価格は高め
 スモールパーツをメール便やレターパックで送ってくれるので受け取りが楽

aitendo
 中国製?の雑多なパーツを扱っている
 掘り出し物がいっぱい
 そして精度の荒いパーツもいっぱい
 出自不明の液晶を使った自作HDMIモニターキットやめちゃ安オリジナルArduinoなど
 良くも悪くもオリジナリティの塊

Amazon
 ご存知世界のAmazon
 意外と電子部品のアイテム数が多い
 気をつけたいのは納期の確認
 中国から出店しているメーカーが混じっているため、到着まで2週間くらいかかる
 これらはメチャ安だがやはり検品が甘い様子
 購入の際は必要数より多めにどうぞ

digikey
 アメリカの電子部品通販サイト
 海外のパーツを直接取り寄せる場合に使う
 販売店向けの卸も混じっているので、少ロット不可の場合があることに注意