ラベル Arduino の投稿を表示しています。 すべての投稿を表示
ラベル Arduino の投稿を表示しています。 すべての投稿を表示

2019年8月5日月曜日

秋月のパトライトで遊んだメモ:卓上ジャグラー

秋月が手ごろな価格のパトランプの取り扱いを開始
この価格帯でパトランプが売られるのは珍しい
形状とサイズがいい塩梅なのでこれを使って遊んでみた

本来は警告灯に用いる

パトランプとは

パトカーや工場などに用いられる回点灯のこと
パトライトとも呼ばれる
ランプを中心として反射板が回転する構造になっている
非常に目立つ

秋月のパトランプ(ASS-12)の使い方

定格電圧(12V)を2端子間に印加するだけ
中央のハロゲンランプが点灯して反射板が回転する
これ以外の制御はナシ

TIPS

・逆方向の電圧印加を許す
 (印加方向に関わらず回転方向は一意)
・端子は筒型圧着端子(オスメス)

注意点

赤色パトライトは警告目的で使われることが多い
周囲を驚かせることになるため、公共の場所で用いるのはおススメできない
また、一般車両に赤色警告灯を付けて走ると道交法で罰せられる可能性がある

作例:卓上ジャグラー

赤色パトライトといえばパチスロである
『レバーを叩くと効果音と共にパトライトが発光回転する』だけの玩具を作った

必要なもの

今回のパーツはほとんど秋月で購入
スピーカーは100均

・スロットレバー
 フォトインタラプタ内蔵のレバースイッチ
 デフォルトHでバネが効いたレバーを上下に倒すとLになる
 配線ミスすると内部のLEDが即死するので注意
 接続はJST ZHコネクタ3p
 (直配線し辛く、壊れやすいので素直にコネクタをかしめた方が良い)
パチスロに付いてるレバーそのもの

・赤色回転灯 ASS-12
 パトランプ本体

・プラスチックケース SY-110G
 タカチのプラスチックケース
 筐体として用いた
 もう一回り大きければよかった(後述)

・DFPlayer mini
 アンプ付きmp3モジュール
 シリアルコマンド制御可能
予めピンがはんだ付けされていて用途によっては邪魔かも

・micro SDカード
 DFPlayer用
 必要なmp3ファイルが入ればよいので極小容量でよい

・効果音mp3ファイル

・Arduino nano
 unoでは無いのはケース容量が小さすぎたため

※音楽再生ができ、入出力ポートがあれば何でもよい
 DFPlayer+Arduinoの代わりにraspberry piでもよい
互換品でもOK

・9V角電池x2、角電池ホルダx2
 電源
 2個な理由は後述

・5Vリレー
 パトランプのON/OFF制御用
 接点容量が12Vを許容すること

・昇圧回路(9V→12V)
 パトランプ用
 9Vでもパトランプは回るため省略可能
 ただし低速でイキが悪い回転となる

・電源スイッチ
 電池を用いるためスイッチが無いと不便

・抵抗
 1k x 2
 10k x 1

 DF Playerのシリアル信号が3.3Vのため、Arduinoと直結すると音楽再生時にノイズが入る
 信号間に1k抵抗を挟むのがセオリーらしいので真似る
 10kはレバー用

・スピーカー
 適当なもの
 DFPlayer単体で十分な音量があるので追加のアンプは不要

作成方法

・レバーを抵抗経由でArduinoの任意ポートに引き込みON/OFF検知可能にする
・リレーの両端に角電池(1)と昇圧回路、パトランプを環状に接続
  リレーの制御ポートをArduinoの任意ポートに接続
・角電池(2)の+を電源スイッチ経由でArduinoのVinピンに接続
  -をArduinoのGNDピンに接続
・Arduinoの5VピンをDF PlayerのVCCに接続
  ArduinoのGNDピンをDF PlayerのGNDに接続
・ArduinoのRXTXを抵抗経由でDF PlayerのTXRXに接続
・DF Player用にリネームした効果音mp3ファイルをmicroSDカードに入れ、DF Playerのスロットに挿す
・DF Playerにスピーカーを接続
・Arduinoをプログラミング
  DF Player用ライブラリを使用
  レバーが倒されたら効果音を鳴らしてパトライトを回す(リレーへ入力する)だけ
・これらを筐体に収める
  必要に応じて穿孔が必要

プロトタイプの様子(Uno使用)
筐体を開けたところ/無計画に作ったしわ寄せが凄い

作成結果

・考えなしに買った筐体のパネルがアルミだったため、加工に非常に苦労した
  (特にレバー用の大穴を空けるのに作業時間の大半を費やした)
  電動ドライバーが死亡

・乱数を使った簡単な抽選と状態遷移をしている
  通常状態:
   1/8:ボーナス成立(キュイン音+パトランプ回転)→絵柄揃い状態へ
   1/8:小役揃い(払い出し音)
   6/8:リプレイ(リプレイ音)
  絵柄揃い状態:
   1/2:BIGボーナス(ファンファーレ)→通常状態へ(パトランプ停止)
   1/2:REGボーナス(ファンファーレ)→通常状態へ(パトランプ停止)

・レバーのケース内占有面積(体積)が思いのほか大きい
  このため、Unoで作っていたものをNanoに変更した

・本来は電池一個で動作していたがNanoに変更した時点で問題発生
  →パトランプ回転時の電圧降下でNanoにリセットがかかるようになった
  (Unoでは許容)
  →電源分離回路を作る気力が無かったので電源2系統に変更
  (パトランプ側(9V→12V)とAdruino側(9V→5V))

・以下は実際に動作する様子を動画で撮影したもの


2017年1月5日木曜日

Amazonで買える中華Arduino互換機メモ

以下、Amazonで山ほど引っかかる中国製Arduino互換機についてのメモ
中国ショップから購入する際の注意点は以前のメモ参照

ちなみにこれらの互換機は海賊版などの非正規品というわけではない
Arduinoはオープンソースハードでありライセンスを守って製造販売するのは合法

価格は2017/01現在
明らかに価格の高いものは省いてある

ArduinoUno

ご存じ一番スタンダードなArduino
オリジナル(Arduino Srl製)の価格は\3000前後

・EasyWordMall UNO R3 【¥425】
・HiLetgo NEWバーション UNO R3 【¥425】
・HiLetgo New UNO R3 ATMEGA328P-16AU CH340G マイクロUSB 【¥399】

ATmega328P(以下AVR)は表面実装タイプ、シリアルコンバータはCH340
イマイチ胡散臭いCH340のドライバをPCに入れる勇気があるかどうか
AVRの交換は無理だが壊れたら本体ごと捨てられる価格だろう

複数ショップで売られているがモノは同じ
USBコネクタ形状が異なる(マイクロUSB)ものもある(機能は同じ) 
CH340がどうしても嫌ならICSPピン経由で書き込む?

ArduinoNano

小型のUnoと考えればよい
シールドを使わない用途ならこちら
オリジナルの価格は\2800前後

・HiLetgo Mini USB Nano V3.0 【¥330】

表面実装、CH340の使用も同じ
今となってはUSBミニB端子は使いづらいかも

Unoとまるっきり同じ

ArduinoProMini

NanoからUSB端子とシリアルコンバータを除去したもの
3.3V版が存在する
オリジナルの価格は\1200前後

・EasyWordMall Pro Mini モジュール Atmega328 5V 16M 【¥312】
・EasyWordMall Pro Mini モジュール Atmega328 3.3V 8M 【¥372】

シリアルコンバータが存在しないため、別途書き込み手段が必要となる
(CH340を使わなくてよいのでこれはこれで良い)
給電も電源ピンに対して5V/3.3Vを直接入れる必要がある

3.3VでAVRを使う一番手っ取り早い方法がこれ
3.3V駆動時には動作周波数が8Mhzになるので注意

CH340未使用なので欠点らしい欠点が無い

その他(DigiSpark)

DigiSparkという製品のクローン
オリジナルの価格は$7.95

HiLetgo ATTINY85 Digispark 超小型Arduino互換 【¥183】

PCはシリアルポートとして認識するのでIDEから書き込みも可能
とにかくコンパクトで取り回しが良い
ミニマムな用途に




2016年12月3日土曜日

シールド/DIP化基板のスマートな保管方法

ArduinoのシールドやDIP化基板は足高で嵩張って保管が面倒くさい
また、信号線の足が剥き出しなので静電破壊なども怖い

以下はこれらを安全かつコンパクトに保管する方法のメモ

用意するもの

・ハードタイプのファイルケース
樹脂製のファイルケース
保存したい部品が入る程度の厚みが必要
100円ショップのもので良い

・導電スポンジ
ファイルケースの内寸と同程度のサイズが必要
また、基板の足を挿して基板自体を保持できる程度の厚みが必要
必ず導電スポンジを用いること
導電性の無いものを使うと逆に静電破壊を誘発してしまう

・両面テープ
市販の適当なもので良い
導電スポンジは秋月で購入/ケース1つあたり3枚必要

保管用ケースの作成

ファイルケースの内側に両面テープで導電スポンジを貼りつけるだけ
スポンジを貼るのは片側で良い
はがれない程度に適当に貼りつけるだけ

保管方法

ファイルケースに貼りつけたスポンジにシールドやDIP化基板を挿す
静電破壊を防ぎ、外から基板を確認することができてスマートに格納できる
背の高すぎるシールドはダメ
外から見える/ケースを立てても大丈夫

2016年7月8日金曜日

Amazonで中国から電子工作部品を買った話

Amazonでは電子工作部品が多数出品されており、その中には中国製の激安品も含まれている
以下はAmazonで中国ショップから電子工作部品を買った時のメモ

中国ショップの特徴:

 ・安い
  とにかく安い
HiLetgo Mini USB Nano V3.0 ATmega328P CH340G 5V 16M マイクロコントローラーボード Arduinoと互換
  ArduinoUNO互換機が445円、Nano互換機が360円とパーツ代も出ないレベルの安さ

シリアルのICも安物なのはご愛敬


 ・送料無料
  マケプレ出品なのだが殆どの店が送料無料
  100円のワイヤー一本だろうが送料無料
  ただしこれには理由がある(後述)

 ・納期が長い
  どの店も判を押したように1週間~2週間ほどかかる
  これは中国からはるばる船便で送ってくるため
  スモールパーツを封筒に入れて向こうから船便を使えば送料は100円台
  送料無料なのもこれが理由

 ・梱包が緩い
  どんなパーツも緩衝材の簡易包装で送られてくる
  端子がちょっと曲がっているとかはフツー

 ・品質も緩い
  コネクタが曇っているとか基板に浅い傷があるのはあたりまえ
  10個買ったら不良品が1,2個混じるのは覚悟すべき
  また、データシートが存在しなかったり基板上のプリントが間違っていたりする
  自力で配線をチェックしたり、外部サイトで情報を集める必要がある

つまりaitendoあたりで売っているパーツを検品前に直接安く買うようなもの
急ぎでない品質が要らないものを買う分にはアリかと

2016年5月11日水曜日

びんぼうでいいの新型発売

aitendoからびんぼうでいいの新型が発売

びんぼうでいいの(S) [U3S]

いつもの紫基板

従来版との変更点は以下の通り
 ・ATmega328Pが表面実装版に変更&マウント済
 ・USBコネクタをマイクロUSBに変更&マウント済(補強用のはんだ付けが必要とのこと)
 ・タクトスイッチとクリスタルを標準搭載に変更

あちゃんでいいのに比べてアップデートが遅かったが今回は大幅更新された

良い点:
 ・安い(マイコン付きで999円)
 ・ピンソケットを付けるだけでUNO互換機として動作する
 ・マイクロUSBコネクタで取り回しが良い

悪い点:
 ・AVRが表面実装のため交換できない
 ・デフォルト状態でブートローダーが書き込まれていない
 ・USB-シリアル変換の石がマイナー(CH340)

ピンソケットを付けても+100円
中国のノーブランド製品とまではいかないがそれでもかなり安い
Uno互換機の選択肢が増えた感じ

2016年2月3日水曜日

あちゃんでいいの新型が発売

aitendoから『あちゃんでいいの』の新型が2製品発売

 あちゃんでいいの(USB)

 あちゃんでいいの(DC)

コネクタはマイクロUSB/給電のみ

arduinoと同じ内径2.1ミリ、外径5.5ミリDCジャック


『あちゃんでいいの』はaitendoのAVRマイコン単体動作用キットのシリーズ
USB-シリアル変換などを取り外した最小構成のArduinoとして使用できる

今回の新型では5V給電用にマイクロUSBコネクタ or DCジャックをマウントしている
 ・使っているLDOのスペックを見る限りはArduino用のACアダプタをそのまま流用可能
 ・USBは給電専用でファーム書き込みには使用不可

従来製品では抵抗/コンデンサが表面実装されていたが、すべて通常のタイプに変更となった

2015年11月12日木曜日

aitendoのコレでいいの

aitendoからarduinoの互換機が発売

コレでいいの(1602)

ルックスはわりといい気がする

arduinoの互換機とはいうものの、構成はAVRの単体動作基板に近い
あちゃんでいいのからLCD接続用端子を引っ張り出したような作り

基板を見る限りはマイクロUSB端子は給電専用
隣のスイッチは電源用

用途はイマイチわからない

LCDを亀の子マウントして使うことを想定している様子
ただしこれだとTX/RXにアクセスできないし外にボタンなども引き出せない
なかなか使い道を見出すのが難しい感じ

『汎用性を保ちながら特定デバイスとの接続が簡単になるArduino互換専用機「コレでいいの」シリーズ第1弾』
と公式にあるので、各種デバイスとバンドルして専用基板を売っていく路線か



2015年9月17日木曜日

『あちゃんでいいの』の新型が発売

aitendoからATmega328の単体動作用ボードの新型が発売


余裕の3色カラバリ

あちゃんでいいの(半実装済み)
あちゃんでいいの(半実装済み)部品付属キット

以前の製品をブラッシュアップした上で表面実装部品をマウント済にしたもの
ICソケット/クリスタル/LED/ピンヘッダ/タクトスイッチは別売となった
(部品付属のキットもアリ)

『あちゃんでいいの』の一番面倒だった表面実装パーツのはんだ付けが不要になった
お値段は部品付属キットでもほぼ据え置き(+11円くらい?)

省略されていたAREFのコンデンサもマウント済
リセットスイッチ周りの電解コンデンサは省略となった


もうAVRを単体動作させるときは全部これでいいんじゃないか…?

2015年7月18日土曜日

ゲームの自動操作装置(3):USBキーボードスケッチ

ゲームの自動操作装置(2):USBキーボードシールド からの続き

以下は前述のUSBキーボードシールドのためのスケッチ

シリアルポートを監視してPCから打鍵情報(1byte)が来るのを待つ
打鍵情報が来たら対応するGPIOへの出力を行う

ピンの最大数は17、打鍵は3種類(ON/OFF/HIT(一瞬ONしたのちOFF))なので1byteで足りる
(スケッチ内では簡単化のために17ではなくキリのよい20で計算している)

また、暴走対策のためにすべてのキーをOFFにするALL_OFF命令を設けている
どのピンに何のキーが対応しているかはこのスケッチでは扱わない

シリアル出力へデバッグ出力を行っているがアプリケーション側はこれを無視してもかまわない


ゲームの自動操作装置(4):アプリ/シリアル通信部分 へ続く

  
#define  PIN_MAX  17
#define  KEY_BASE  20

#define  KEYTYPE_HIT  0
#define  KEYTYPE_ON  1
#define  KEYTYPE_OFF  2
#define  KEYTYPE_MAX  2

#define  ALL_OFF  0
#define  KEY_DELAY  100

char command = 0;
int pin;
int commandType;
int commandNum;

void setup()
{
  Serial.begin(9600);
  for(pin = 2; pin <= 17; pin++)
  {
    pinMode(pin, OUTPUT);
    digitalWrite(pin, HIGH);
  }
}

void loop()
{
  if (Serial.available() > 0) 
  {
    command = Serial.read();
    if(command == ALL_OFF)
    {
      Serial.print("command:");
      Serial.print(command, DEC);

      Serial.print("ALL OFF");
      for(pin = 2; pin <= 17; pin++)
      {
        digitalWrite(pin, HIGH);  
      }      
      delay(KEY_DELAY);
    }
    else
    {
      commandType = (int)(command / KEY_BASE);
      if(commandType <= KEYTYPE_MAX)
      {
        pin = (int)(command - (KEY_BASE * commandType));
        if(pin <= PIN_MAX)
        {
          Serial.print("command:");
          Serial.print(command, DEC);
          Serial.print(" commandType:");
          Serial.print(commandType);
          Serial.print(" pin:");
          Serial.println(pin);
           
          switch(commandType)
          {
            case KEYTYPE_HIT:
              Serial.print("HitKey");          
              digitalWrite(pin, LOW);
              delay(KEY_DELAY);
              digitalWrite(pin, HIGH);
              break;
            case KEYTYPE_ON:
              Serial.print("OnKey");          
              digitalWrite(pin, LOW);
              delay(KEY_DELAY);            
              break;
            case KEYTYPE_OFF:
              Serial.print("OffKey");          
              digitalWrite(pin, HIGH);
              delay(KEY_DELAY);
              break;
            default:
              Serial.println("UnknownType");
              break;         
          }
        } 
      }
    }
  }
}

ゲームの自動操作装置(2):USBキーボードシールド

ゲームの自動操作装置(1):全体の構成 からの続き

必要な機能:

 ・ホストに対してUSB接続が可能であること
 ・ホストに対してUSBキーボードとして振舞うこと
 ・PCとシリアルポートで接続可能であること
 ・PCからシリアル通信で打鍵情報(何を押すか?)を受け取れること
 ・受け取った打鍵情報をUSBキーボードの打鍵に変換してホストに出力できること
 ・打鍵する可能性のあるキーは10種類程度とする

作例1:市販のキーボードを用いた例
 
 USBキーボードを分解してキー部分の配線を引き出す
 配線はマトリクス上になっており、2線の接続の組み合わせで任意キーの打鍵となる
 必要なキーの配線を引き出し、フォトリレーの両端に接続する
 フォトリレーのアノードにArduinoの出力ピン、カソードにGNDを接続する
 このときどちらかに適切な抵抗をはさむこと
 (フォトリレーの内部LEDが破損するため/電流値はフォトリレーのデータシート参照)

 これでArduinoのピン出力を打鍵に変換することができる
 スケッチについては次回のメモを参照
 
作例1:無線キーボード+電池BOX+フォトリレーシールド(自作)+Arduino Uno


フォトリレーシールドの裏面/無計画に作るとこうなる

  作成時に必要なキーが絞り切れていなかったため、15種のキーに対応している
  電池BOXは無線キーボードへの給電用
  ゲーム機には専用無線ドングル経由でUSB接続を行う

  ※作例では無線キーボードを使ってしまっているがこれは電波法に抵触するのでダメ
    有線キーボードを使うこと


作例2:市販のキーボード/GPIO変換機を用いた例

 ビットトレードワン/REVIVE USBを用いた例
 ポートとキーの設定は専用の設定ツールを用いて行う

作例2:REVIVE USB+プロトシールド+Arduino Uno
 
 必要なキーの絞り込みをおこなったため、8種のキーに対応している
 作例2と同じ機能の装置が簡単かつ簡潔に作成できている
 (配線が散らかっているのは作例1と互換をとったため)

 市販製品があるものは積極的に使ったほうがよい
 プロトシールドのブレッドボード上に構築しているので再利用も簡単


ゲームの自動操作装置(1):全体の構成

過去にコンシューマTVゲームにのめり込んでいた時期があり
「他の作業中でもレベルアップできないか?」
とArduinoとWindowsアプリケーションで自動操作装置を作った
(止めた今となってはなぜそこまで傾倒していたのかがわからない・・・)

以下はその記録
なお、ネットワークゲームサービスなどで自動操作を用いると確実に処分対象になるため
使用はおススメしない


・全体構成
  
  ゲーム機からの画像情報をUSBキャプチャ/キャプチャソフトを用いてPCに表示させる
  これらはすべて市販のものでかまわない

  PC上の自動操作アプリケーションはPCに表示される画像を認識できる
  この情報を用いて状態を判断し、次にすべき操作をArduinoに出力する
  アプリケーションは自作

  Arduinoを使ったUSBキーボードプロジェクトをゲーム機にUSB接続する
  これはゲーム機側からはUSBキーボードとして認識される
  このプロジェクトも自作

  ArduinoはシリアルポートでPCとも接続する
  アプリから送られる操作情報をUSBキーボードの打鍵としてゲーム機に伝達する

  
  このプロジェクトではゲーム機への入力にUSBキーボード入力を用いたが
  ゲーム機のコントローラーとフォトリレー等を組み合わせればコントローラー入力も可能

 
システムの構成

2015年7月16日木曜日

ArduinoプロジェクトとWindowsアプリケーションの連動:接続方法

ArduinoプロジェクトとPCのWindowsアプリケーションの連動を考える


まずArduino―PC間の接続方法について


ケース1.Arduino内蔵USB-シリアル変換を使用する
 USB-シリアル変換を持つArduinoならば一番簡単な方法
 USBケーブルが給電と通信ケーブルを兼ねるためスマートに接続できる
 
 
ケース2.外付けUSB-シリアル変換を使用する
 USB-シリアル変換を持たないArduinoやAVR単体動作時はこちら
 FTDIのICを使っていて5V/3.3V切り替えスイッチのあるもの、DTRピンがあるものがおススメ
 例:FTDI USBシリアル変換アダプター  
 (AVRへのシリアル書き込みが可能であるため)

 ArduinoのTX/RXと信号レベルを合わせること
 USB-RS232C変換機と絶対に間違えないこと
 (RS-232Cの信号はMAX15V程度なので簡単に破損する)



ケース3.Bluetoothブリッジを使用する
 市販のブリッジICを用いる
 Bluetoothのコネクション確立後はシリアルポートとして扱うことができる


ケース4.SDカードを使用する
 データの交換のみならば直接接続する必要は無い
 ArduinoからのSDカードへのデータ書き込みは容易(ピンを4つ使うのみ)
 市販のSDカードシールドを用いるとさらに楽


ケース5.無線サーバ機能付きSDカードを使用する
 FlashAir など、デジカメ用の無線サーバ機能付きSDカードを使う
 Arduinoからは通常のSDカードに見える
 PC側からは無線サーバに見えるのでArduinoが書き込んだファイルへのアクセスが可能

東芝FlashAir/バージョンが複数あるので注意

直接通信する場合は全部シリアル通信でOKということがわかる

2015年7月13日月曜日

aitendoのArduino関連商品(2)

前回の続き

あちゃんでいいの [AKIT-ADINO]  ○
 AVR単体動作用の最小構成ボード
 安価だがUSBシリアル変換と電源以外の機能はすべて備えている
 ただただ安い
 難点は抵抗とコンデンサがチップタイプなのでハンダ付けの難易度が高いところ
 電源は2.54ピッチ2ピンへ5V/GNDを直接接続する

 2015/09/24追記:チップ抵抗/コンデンサが実装済の新型が発売された

拙作の裏面


極小AVRマイコンキット [CORE8]  ○
 AVR単体動作用の補助ボード
 単体動作に最小限必要なコンデンサとRESETピン用抵抗のみを備えている
 クリスタルやリセットボタンは外付けする前提で別売
 コンデンサを外付けするよりレイアウトがかなりスッキリしていい感じ
 難点は抵抗とコンデンサがこれまたチップタイプなところ

拙作の裏面

CORE8のほぼ等価回路/これがピンソケットの基板裏にスッキリ収まる


ぶれぼでいいの [BBDeiino]  ○
 ブレッドボード上で最小構成Arduinoを構築するためのキット
 前述の『あちゃんでいいの』を分割してピンソケットとピンヘッダを除いたもの
 別途ブレッドボードが必要となる
 使用時に基板がAVRの上を跨ぐという大胆な構造
 こちらは抵抗/コンデンサはチップタイプでは無い
 
USB電源キット [K-UBF6209] ○
  降圧機能付きUSB電源キット
 5Vの他に1.8~4.4Vに降圧した出力があるのがユニーク
 降圧する電圧は固定でありキットによって異なる
 出力用のピンヘッダは別売(2.54mmピッチのピンを立てるとよい)
 ピンを立てたらメスーメスのピンヘッダ接続ケーブルがあると便利
 (リンク先のケーブルは20Pだが、必要な数だけ割いて分割できる)

『あちゃんでいいの』との組み合わせ(5Vポートより給電)


USB-シリアル変換 ×
 USBシリアル変換の無い構成のArduinoでスケッチを書き込むのに必要
 USB-RS232C変換ではないことに注意
 aitendoの安価な製品の多くは変換ICにCH340を使っているのでできればパスしたいところ
 FTDIのICを使っていて5V/3.3V切り替えスイッチのあるもの、DTRピンがあるものがおススメ
 (DTRピンが無いとArduinoの書き込み用途に使えない)

 aitendoで該当するのはこれ
 秋月ならばこれ
 スイッチサイエンスならこれ

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はびんぼうでいいのを使用


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

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