夏休み工作第二段 Arduino 単体でPong

以前、テニスゲームがArduino 単体でVGA 出力して遊んでいるビデオをYouTubeで見ました。

なつかしのテニスゲーム!

8月23日には、二人用でコードを修正したビデオがアップされているようです。Roberto Melzi さんがブログに遊びに来てくれて、新しいコードとビデオをアップしたよって教えてくれました。arduino フォーラムはこちら

 

ありがとう、Roberto さん

  [youtube https://www.youtube.com/watch?v=hVzA3x4EiT4]

これは、もう作らずにはいられませんよね。早速、コントローラー作りの材料を物色している最中です。

 

作者の作り方を真似てみることに。ビデオのスクリーンショットからどんな材料が必要か検討します。

VGA_Pong_on_Arduino_Uno_-_YouTube

木箱を利用しているようです。

VGA_Pong_on_Arduino_Uno_-_YouTube 8

全体の配線はこのようになっているそうです。

VGA_Pong_on_Arduino_Uno_-_YouTube 2

コントローラー同士は、USB ケーブルを利用しているようです。

VGA_Pong_on_Arduino_Uno_-_YouTube 3

コントローラーAには、Arduino Uno 本体が収められています。

VGA_Pong_on_Arduino_Uno_-_YouTube 4

ロータリー式の抵抗とボタンがあればできそうです。

VGA_Pong_on_Arduino_Uno_-_YouTube 5

スピーカはコントローラーAの親機側についているようです。

VGA_Pong_on_Arduino_Uno_-_YouTube 6

コントローラBとの結線は4線です。

VGA_Pong_on_Arduino_Uno_-_YouTube 7

なるほど、参考になりました。

 

必要なパーツ

1) ロータリー式のポテンションメータ とつまみ ・・・・ x 2個
2) ボタン ・・・・・・・・・・・・・・・・ x 2個
3) コントローラ A と B を結線する 4芯ケーブル&ソケット ・・・1 ~ 2 M 程度
4) 抵抗 1.8K 程度 ・・・・・・・・・・・・ x 2個
5) 収める箱 ・・・・・・・・・・・・・・・ x 2個
6) スピーカ ・・・・・・・・・・・・・・   x 1個

———————————————————
7) VGA メスコネクター ・・・・・・・・・   x 1個
8) 抵抗 68オーム ・・・・・・・・・・・・・ x 2個
9) 抵抗 470オーム ・・・・・・・・・・・・  x 2個
10) Arduino 本体 ・・・・・・・・・・・・   x 1個

とりあえず、1~6あたりの材料を物色。最近は、ロータリー式の抵抗は使わないのであるかどうか?

7~10は、前回のを流用、本体は、Arduino Nano 互換機を使い小型化してみます。5V 電源も内蔵させて、親機とコントローラA + B に分離したほうが遊ぶ時、ポジションの自由度があがりそうです。

 

材料物色中

ジャンク箱から、素材を取り出しました。

ピンク矢印のパーツを使う予定。目玉おやじは頭を押すとスイッチになっていてしゃべります。マクドナルドのおまけのやつです。その横の丸い蓋があるのは携帯灰皿で蓋を開くとLED が点灯していたのでスイッチになるかと。

ラケットは本体ケースにしてpong っぽい雰囲気を出そうかという狙い。電源ユニットは、リチウム+充電ユニットに100円ショップの5V昇圧ユニットを利用。これをラケット形の本体に入れようかという狙い。本体(ラケット)+コントローラA(目玉おやじ) + B(携帯灰皿) という構成になります。

 写真_1

 

可変抵抗のジャンクがありませんでした。見つかったのは、半固定抵抗の以下。かなりレア品な昔のレコードプレーヤーの基盤です。1980年代くらいじゃないかと。20年から30年前の基盤のパーツはまだ大きくて使いやすいです。

 写真 4

この半固定抵抗にグルースティックをつけて、以下のつまみを付ければホイールコントローラになりそう。このつまみは何のか忘れましたが、2つ転がっていたのでちょうどいいやと思いまして。

写真 2

USB のメスジャックはiMac のジャンクマザーボードから引っこ抜きます。

写真 3

 

ケースとコントローラのにするものを迷っていたのですが、しっくり来そうなものが見つかったので工作に入ろうかと。ああでもないこうでもないと、考えながら素材集めに半日かかりました。こういうところがジャンク工作の楽しさです。

 

まずパーツを取り外しにかかります。長くなったので、次回工程にて紹介します。

初めてのIoTデバイス完成

ESP8266 をはじめて見たとき、IoT デバイスを作りたくてゲットしたのでやっと念願かなって出来ました。

ブログは目次がないので見にくいので、道のりをリンクしておきました。こうして改めて道のりを見てみると、最初にデバイスを見たときから4ヶ月経ったんですね。速いものです。あのころは、FDD でプロッター作っていまして素材を物色中に面白そうなデバイスだなと試しに買ったわけでして。こんなに面白いデバイスだったとは露知らず。

目次

続々と素材をゲット 2015/04/18

ESP8266 ESP-12 DoubleBlink 2015/05/08

ESP12単体でwifi connection 2015/05/09

ESP12単体で光センサーアナログ読み 2015/05/09

5V 18650 リチウムバッテリー充電モジュール 2015/05/10

ESP8266 ESP-12 spec 2015/05/11

AM2302温度湿度センサーをArduino Nanoでテスト 2015/06/14

ESP12単体で湿度温度照度のIoTデバイス 2015/06/15

ESP12の配線いろいろ 2015/08/19

Pin半田付け 2015/08/21

リチウムバッテリー駆動でESP-12 2015/08/23

3.3V 固定 DC-DCコンバータを調査 2015/08/23

100円均一の昇圧を使いまわし実装 2015/08/24

 

とにかく、現場合わせで成り行きで作っていったので温度湿度センサーを乗せる場所がありません。うーむ、どうしようかと思案したあげく、ESP12 の上に乗せることにしました。足を延長してPin ジャックに指すように実装。これでI2C デバイスを交換するときも可能ですしね。

b

とりあえず、部品が全部のるかどうか仮置き状態。なんとか載りそうです。

a

ESP12 の下は床下配線。裏面でもよかったのですがどうせ隙間があるのだから有効活用と。プログラムコードも書きかえれるよう、UART の差込口も隙間に納めました。

 

で、全部組み終えて稼動した全体図がこちら。データをアクセスしているときに点灯するLED はフロッピーディスクのアクセスランプでちょっと小ぶりのやつです。下点灯していないのは赤いLEDで、100円均一の車載用12V ステップダウンDC/DC コンバータのジャンクからゲット。こちらも少し小ぶりでちょうど良かったです。

1

リチウム電池を充電しながら稼動も可能です。これがしたかったがために、100円均一のDCDC で5V にしてその後3.3V にするロスが出ています。将来は、これをバックブーストタイプの1セル用に作られたIC を使い3.3V を作りたいです。

2

UART のジャックがあるといいなと思っていたので、そういうのを隙間に作りました。これでコードのデバックや新しいプログラムも利用可能です。

3

苦肉の策で、温度湿度センサーはこのような配置となりました。

4

5V に昇圧した配線がちょっと難ありですが、まぁとりあえずです。

5

 

今回勉強になったこと

・リチウム電池の変動は4.2V から 2.4V まであり、3.3V 出力する場合はバック・ブーストという方式DC-DC コンバートが有利

・バック・ブースト方式は、英名buck–boost converterで日本語では昇降圧コンバータ

・バック・ブーストは、入力が低い場合は昇圧動作、入力が高い場合は降圧動作をする

・専用IC は各社あり最も有名なのは、LinearTechnology 社のTPS63000シリーズか、LTC3xxxシリーズ

・LT社のバックブースト用ICの検索はここが便利

・1セル用の汎用モジュールは、あまりない。見つかったのはストロベリーリナックスさんが作っているもの

・太陽電池からの充電ユニットもこのバックブースト方式を使っているが、そのモジュール化されたものはVinの最小最大が大きいので、1セル用としては向かない

・電源ソースに、18650のリン酸鉄リチウムイオンバッテリー(Lifepo4)を使いたいところだが、電源管理モジュールが3.8V カットするものがない。あるはずだがまだ見つかっていない

・おそらく、リチウム1セルを使った製品にはこれがあるはず。携帯とかスマホとか。今度ばらしてみたい。

 

今回の工作でわかったこと

・ユニバーサル基盤でも頑張れば、このくらいまでは密度が上がる

・IoT デバイスというものがどういうものか体感できた(が、ロガーとの差がピンとこない)

・開発ボードを使って作ったほうが多少大きくなるが、速い(テストなら十分、小型)

・充電式にしてみたが、DeepSleep を活用し単3電池とかでもいいんじゃないの?

・そもそもWifi があるところって電源もあるから5V のUSB に挿せるタイプでいいんじゃないの?

 

今後の課題

・3.3V 生成にバックブースト方式の回路を採用したい

・Deep Sleep の検証

・WiFi がない環境でも採取できるようフラッシュメモリ領域に保存、後にアップロードしたい

100円均一の昇圧を使いまわし実装

バックブースト回路を作るか、買うかは課題としてとりあえず今の手持ちの部品でリチウム電池の変動をカバーして3.3V を作り出すのは以下のようにすることにしました。

 

リチウム電池 > 充電ユニット > 5Vスイッチング昇圧 > 3.3Vレギュレーター

ロスが2重に発生するので効率が悪いですが、とりあえず実験。

5Vの昇圧スイッチング回路は100円均一のがあるのでこれを流用。4.2V ~2.4V まで安定化電流を変動させて5V は無負荷で出るようです。この5V出力を3.3V レギュレーターに通しESP12 へ給電します。

テストでは、2.7V 付近になるとアクセスポイントへの接続が不安定になりました。3.0V くらいでは安定しているのでとりあえずいけるんじゃないかと見切り発車。

とりあえず、これで組み込んでみることにします。

写真 1

仮配線

写真 2

100円均一のばらした5V昇圧ユニット

写真 3

どうやら、うまく動作しているようです。これで充電しながらでもできる状態が作り出せました。おまけ機能で5V のi-Phone充電機能もついてきます。

メインスイッチが欲しいんですが、手元にないんですよね。まぁ、いいか。組み込みます。

とりあえず、電源部が出来ました。Junkな部品が約に立ちました。2階建て、両面テープ、空中配線。落としたら壊れますが。

写真 1

これでリチウム電池を充電しながらでも、動かせます。

写真 2 

あとは、ESP12 本体、センサー、リセットスイッチとメインスイッチをなんとか乗せればOK.

FDD8

いやぁ、ゴールデンウィークも最終日ですね。自分は、明日もあさっても休みなのでまだお休みなんですが、ついにプロッターができました。

[youtube https://www.youtube.com/watch?v=q00rKc7ZEUU]

詳細は後ほどとして、まずは感じを出力させましたのでスクリーンショットなど載せておきます。

Grbl_Controller_3_6_1_と_Windows7__Running_

WEBサービスのEasel で作成中の漢字「美」。SVG ファイルをインポートしたものです。大きさは25mm x 25mmの中にちょっと小さめで割付。

Easel_-_kanji-bi 2

Machine からG-Code を出力すると右側に3D プレビューが出ます。ペン上げ幅は、3mm

Easel_-_kanji-bi

全体の編集画面は、こんな感じです。

Easel_-_kanji-bi 3

ポストイットに、プロットした直後。

IMG_0253

なかなか、いいんでないでしょうか?

IMG_0256

消せる水生ボールペンの赤です。

IMG_0258

当初、画像が鏡面状態になって修正方法がわからずかなりハマリマシタ。下のABC は米粒大。ちょっと潰れますね。軸の精度とペンの滲みがあるのでまぁ、しかたないですが。

IMG_0257

精度はまぁ、こんなものです。

IMG_0247

とりあえず、できました!。

後ほど、映像でも載せます。冒頭に載せました。さぁ、気分転換に外出してきまーす!

FDD7

さて、前回まででプロッターとしての機械的な部分は完成したのであとは、それを送り込むソフトウェア側の問題です。

試してみて、堂々巡りになってきているのでとりあえず情報を整理してみます。簡単に言えば、はまってます。

 

全体の仕組みとしては、以下のようです。

・Arduino 側でG-CODE を受けて解釈し、モータードライバーへ信号を出す仕組み。

GRBL
https://github.com/grbl/grbl/wiki/Compiling-Grbl

HexUploader

https://github.com/paulkaplan/HexUploader/wiki/Using-HexUploader

http://paulkaplan.me/HexUploader/

・PCからG-Code をUSB シリアル経由で流し込む仕組み

いろいろあります。osx で対象となるものは、以下の2つが見つかりました。

Universal-G-Code-Sender
https://github.com/winder/Universal-G-Code-Sender/downloads

https://github.com/winder/Universal-G-Code-Sender

Grbl Controller
http://zapmaker.grblcontroller.s3-website-us-west-2.amazonaws.com/

・G-CODE を作成

こちらも、いろいろとあるようです。3次元加工ができるものから、プロッター用途までさまざま。フリーで使えるものを対象に選んでみました。

InkScape + Inkscape Gcodetools plug-in

https://inkscape.org/en/download/

http://www.cnc-club.ru/forum/viewtopic.php?t=35

or

InkScape + Big Blue Saw DXF Output

PyCAMでG-Code を生成 (以下に、Homebrew での手順)

http://www.shapeoko.com/wiki/index.php/PyCAM-MacOS

or

WEB Services の Easel

http://app.easel.com/

 

とりあえず、Arduino 側へgrblのバイナリを転送します。

以下からダウンロード。HexUploader を使いアップロードします。

https://github.com/grbl/grbl

osx だと、HexUploader が使えるらしいんですがアップロード方法がよくわからず、結局VirtualBox のWIN7で Xloader を使いアップロードしました。

screen1

http://xloader.russemotto.com/

 

VirtualBoxだと、一回USBをはずしてつければ認識するはず。ドライバーは以下を入れました。

image

http://wch.cn/download/CH341SER_ZIP.html

 

以下のように、COM4 で認識したのでXloader のポートを合わせて、Device にはNano を選択。

image

 

 

 

ちょっと、ここらで言葉の整理を。調べ物をしていると、CAD と CAM という言葉が出てきます。

CAD はデザインする computer aided design でなじみがありますが、CAM とはCNC マシンに渡すデータを作成する処理とのこと。つまり、CAM とはG-Code を作成する処理のことと理解しました。

 

1

これがスタンダードなワークフロー。そして、これをすっ飛ばすWEBサービスがEaselというのがあるようです。

 

2

 

Inventables 社のアカウントを作ります。

https://www.inventables.com/sessions/new

Inventables__The_Hardware_Store_for_Designers

ログインして、図を書きMachine から各種設定をしてAdvanced からG-Code が出るようです。

Easel_-_star

ちょっとよくわかりませんが、とりあえずG-Code を作成してみます。

Easel_-_star 2

Generate g-codeで3D画面に出ます。Export してファイルに出します。

Easel_-_star 3

このファイルは以下のよう。

G21
G90
G1 Z2.000 F228.6
M3 S18000
G1 Z2.000 F228.6
G0 X14.521 Y14.973
G1 Z-0.051 F228.6
G1 X14.521 Y14.973 F635.0
G1 X21.512 Y13.953 F635.0
G1 X16.456 Y9.024 F635.0
G1 X17.646 Y2.066 F635.0
G1 X11.397 Y5.350 F635.0
G1 X5.151 Y2.066 F635.0
G1 X6.341 Y9.027 F635.0
G1 X1.284 Y13.953 F635.0
G1 X8.276 Y14.973 F635.0
G1 X11.400 Y21.300 F635.0
G1 X14.521 Y14.973 F635.0
G1 Z2.000 F228.6
M5
G0 X0.000 Y0.000

 

で、これをGrbl Controller 3.6.1 から読み込んでみます。これは以下にユーザがビルドしたものがあります。

FDD6

さぁ、お休みに突入しましたのでJunkなFDDでプロッターを作る続きの作業をやりましたよ。

まず、筐体を仮組みしていたのを本格的に組み付け作業です。2つ穴をあけてボルト締めした後、いらないプラスティック部分を切り落とし、古いパソコンの筐体の裏側に貼り付けてあった金属板を切り出しました。

IMG_0216

これは、手曲げ加工して筐体に貼り付けて、ボロイ雰囲気を出そうという魂胆です。素材を見るとスリット加工してあり、ほどよく腐食している部分がかっこいいなと、ここを使うことにしました。

昔のPCには、電磁波防止だったのでしょうか? こんなパーツと筐体加工があったとはね。

IMG_0215

で、程よく加工して両面テープで貼り付けました。どうでしょうかボロイ雰囲気でていますかね? えっ?そんな加工しなくても十分ボロイですって? 確かに。

 

あと、ガレージのジャンクを物色していたら、バイクのバッテリーがありました。12Vのやつでもう使えないんだけども、モーターくらい回るかもと思い充電してみることに。

IMG_0222

容量が2.3Aくらいなので1/10くらいのの0.3Aで10時間くらい充電してみまいた。充電前は、4Vくらいあったのでもしかしたら使えるかもと思いましたが、充電後10.34Vくらい。うーん、13Vは超えていないようでだめっぽいかも。

 

いちおう、モーターは回りましたが電圧降下が激しくすぐに6V以下になってしまいます。鉛蓄電池の原理は知りませんが、電気を溜め込む要素が不足しているんでしょうね。これは寿命です。

筐体の一番下に置いて、重しにはなりそうなのでとりあえず作業を続行。最終的には、ソーラーパネルのちっこいのを上に乗せていつでも使えるCD-ROMレーベルプロッターにしようかなという魂胆だったのですが、、、まぁ、おいおい考えるとして。

 

で、ちょっと配線を変えて、コードはこんな感じにしました。AccelStepper でZ軸を追加した形です。Step と DIR のピン配線は前回と若干変えてあります。

 

/*
 Junk FDD Stepper Motor Control Sample.
 xy table moving sample.
 AccelStepper ver 1.47
 JunkHack 2015.04.26
          2015.05.04 Z-axies add
 */

#include <AccelStepper.h>

AccelStepper y_stepper(1, 2, 5); // 1 > two wires. 2 > STEP pin , 5 > DIR pin.
AccelStepper x_stepper(1, 3, 6); // 1 > two wires. 3 > STEP pin , 6 > DIR pin.
AccelStepper z_stepper(1, 4, 7); // 1 > two wires. 4 > STEP pin , 7 > DIR pin.
int halfRev = 700; // 片道移動幅 ( Step )
int halfdelay = 10;

void setup() {
    y_stepper.setMaxSpeed(6000); // 最大許容速度
    y_stepper.setAcceleration(12000); // 加速
    x_stepper.setMaxSpeed(3000);
    x_stepper.setAcceleration(6000);
    z_stepper.setMaxSpeed(3000);
    z_stepper.setAcceleration(12000);
}
void loop() {
    if (y_stepper.distanceToGo() == 0) {
        delay(halfdelay);
        halfRev = -halfRev;
        y_stepper.moveTo(halfRev);
    }
    if (x_stepper.distanceToGo() == 0) {
        delay(halfdelay);
        halfRev = -halfRev;
        x_stepper.moveTo(halfRev);
    }
    if (z_stepper.distanceToGo() == 0) {
        delay(halfdelay);
        halfRev = -halfRev;
        z_stepper.moveTo(halfRev);
    }
    y_stepper.run();
    x_stepper.run();
    z_stepper.run();
}

 

とりあえず、これで3軸が動きました。動画もよかったらどうぞ。

[youtube https://www.youtube.com/watch?v=eTOpfWcYASM]

次なる課題は、G-CODEという座標軸を操作するものを送り込むようにしたいのですが、どうやるのかよくわかりません。ちょっと調べることにします。

※現在、ものすごくはまり中。次号にて報告します。