自作15ドル壁面プロッター:Arduinoで安価にDIY
コンポーネントと用品
| Arduino UNO | × | 1 |
| 28BYJ-48ステッピングモーター(ドライバー付き) | × | 2 |
| TSOP 4838 IRレシーバー | × | 1 |
| SPI接続 Micro SDメモリーカードリーダー | × | 1 |
| SG90マイクロサーボモーター | × | 1 |
必要な工具と機械
- 3Dプリンター(汎用)
- はんだごて(汎用)
アプリとオンラインサービス
- Arduino IDE
このプロジェクトについて
背景
いつ始まったか正確には覚えていませんが、1999年頃だったと思います。ロボティクスと電子工作に熱中していた友人と、ホワイトボードに描画するロボットを作る話をしていました。もちろん当時は本格的にやる時間もなく、ホビースト向けマイコンのエコシステムも今ほど整っていませんでした。
2002年、友人がJürg LehniとUli Frankeの「Hektor」という素晴らしい作品を見せてくれました。私たちが夢見ていた壁面プロッターに似たものが実際に作られ、世界に公開されていたので、とても嬉しかったです。安心しました。
その後、Hektorのプロジェクトサイトを誰かに見せ「いかに素晴らしいか」を説明したとき、詳細を見ていて当初私が想像していた壁面プロッターに欠けていた一つの特性に気づきました。私は「自己完結型」で、すべてが一つのユニットに収まり、壁との接続はワイヤーだけ、というものをイメージしていました。ステッピングモーターの重量を調べた時点で、自分のアイデアは実現不可能だと諦めました。
時が経ち、ホビーロボティクスの分野で色々なことが起きました。2014年、私はArduinoとRCサーボを使った様々なカメラ制御プロジェクトをやっており、3Dプリンティングにアクセスでき、なんと暇な時間までありました(!?)。激安の28BYJ-48ステッピングモーターを見つけたとき、まさにこれを作ろうと確信しました:
可能な限り安価でミニマルな壁面プロッター。
最初の試み
中国から注文したパーツが届くまで5週間ほど永遠に待った後、プロッターの構築を開始しました。Arduino Uno、ステッパー、サーボ、バッテリーを収められるだけコンパクトな骨組みを作ろうとしました。OpenSCADでどれだけ「愚かな(いや、賢くない)」設計を繰り返したか覚えていませんが、ようやく閃きました。糸を交差させなければならない!

交差ジオメトリには、壁面上での正しい位置維持という大きなメリットがあります。欠点は、垂直軸周りの回転に対する安定性が低下することです。これは、プロッターの四隅にジップタイを取り付け、回転を防ぐように調整することで対処しました。
最初のプロッターのハードウェアは下の写真のようになりました。最安パーツを求めて、ナビゲーションと重力相殺に縫い糸を使いました。糸は3Dプリントシャーシの上部、プリントの小さな穴を通って交差しています。(Arduinoから右ステッパードライバーへの配線が写真では欠けており、実際より綺麗に見えています)ペンはRCサーボでプロッター全体を壁から押し離すことで描画面から浮かせます。

この最初のプロッターは、Arduino上のプログラムに設計がハードコーディングされていました。セットアップは、両側に1メートルずつ糸を出し、アンカーポイントを1メートル離して固定することで行います。これでプロッターは起動時に座標系を知り、メモリ内のパスを描画開始できます。動きましたが、使い勝手は最悪でした。設計変更のたびにArduinoを再書き込みするのは面倒だし、1メートル固定のセットアップに縛られるのもフラストレーションでした。
しかし、問題空間をよりよく理解するための良いプラットフォームにはなりました。いくつかの速やかな学び:
- ステッピングモーターはそれほど強くない - スプールが大きすぎた。
- ペン先が糸の交差点からオフセットしている - ひどいブレ
これらの問題のおかげで、まともな加減速の実装に労力を注ぐことになりました……
進化
2号機(表紙画像の白いもの)はいくつか改良しました:
- スプールを小型化
- スプールをペンの上に移動し、糸のルーティング改善と振り子運動の低減
- 電子部品をよりアクセスしやすく配置
- 描画データ保存用SDカード追加
- アンカーポイント間距離を可変にする新しいセットアッププロセス
- リモコン操作用IRレシーバー追加
SDカードリーダーとIRレシーバーの追加は、最初に想像していたよりずっと簡単でした。「最初からやっておけばよかった」という瞬間です。新しいセットアッププロセスはかなりうまく機能し、大小様々な描画に柔軟に対応できるようになりました。これまでで最大の描画は約2.5メートル幅でした。

セットアップはリモコンでプロッターをナビゲートして行います。まず位置Aをマークし、次に位置Bに移動してマークします。左右の縫い糸に20cmマーカーをつけておけば手動測定不要です。距離mは、左ステッパーのステップ数をAからBへ移動中にカウントするだけで求まります。プロッターがdを知り、現在位置がBだと分かれば、アンカーポイント間とその下の空間で自由に移動・描画できます。
3号機(動画のオレンジ色のもの)は前作とよく似ていますが、いくつか変更があります:
- すべての電子部品をArduino用シールドとして実装
- バッテリーレベル監視機能追加、「一時停止 - バッテリー交換 - 再開」が可能に
これはいい意図でしたが、ステッピングドライバーICをシールドに直付けし、ステッパー付属のドライバーを使わなくなったため、点滅LEDがなくなりました。見ていて寂しいです。超退屈。また、ArduinoオンボードLEDがシールドの裏に隠れ、IRレシーバー受信時の便利な点滅が見えなくなり、キャリブレーションボタンを押したかどうか不安になります。バッテリーレベル監視はいいアイデアでしたが、実際には長時間描画ではケーブル給電に頼ることになりました。
4号機(最高傑作!)は弟への誕生日プレゼントとして作りました。点滅ドライバーをあえて露出させ、見た目も最高に仕上げたシールド型電子部品です。ケーブルが必要以上に長いのは見た目重視です!

5号機(マクガイバー版)は、このプロジェクト説明用の概念実証として実際に作ったものです。特別な工具なしでプロッターが作れることを示きたかったのです。ガレージに座って、何で作れるか周りを見渡しました。タイワイヤー(鉄筋結束用の軟らかい金属線)が第一候補でしたが、探しているうちにダクトストラップを見つけ、これで時間短縮と安定性向上が図れると判断。ジップタイとガムテープも候補でしたが不要でした。唯一悩んだのは、手間をかけずに良いスプールをどう作るか。家に戻ってコーヒーを飲もうとしたら、牛乳パックのキャップがありました!正直、オリジナル設計を3Dプリントする時間より短時間でフレームが完成しました。他のプロッターとほぼ同等(ほぼ、ですが)に動作します。






6号機
え、また作ったの? どうしても作りたくなったんです。気になっていたいくつかの点を解決したかったのと、こちらへのコメントで改善点があったためです。
- 3Dプリントサイズが大きすぎて時間がかかる
- プロッター全体ではなくペンだけを動かす方式も試す価値あり
- サーボとIRレシーバーを「アナログ」ピンに移せばシリアルデバッグが可能に!(jrcTexasさん、指摘ありがとうございます!)
その結果がこちら:





この新設計、どうですか? 良い面も悪い面もあります。全体的に変更は良い感じですが、一つ問題があります。ペンがフレームに固定されていないため、描画時に少しグラつきます。これにより精度は前世代より劣ります。大きなメリットは、デジタルI/Oピン0-1が空くためデバッグ用シリアル通信が使えるようになったこと。これで開発が劇的に楽になりました!
ステッパーのストレステストも始め、ステップ欠けを防ぐ方法を探りました:

ストレステストから分かったのは、トルクを確保するために少し減速する必要があること。また、プロッターの壁面上の位置による糸への実際の引っ張り力を計算しました。
ステップシーケンスや電圧の影響も今後調査したいと思います。いつか。
プロッターの使い方
セットアップと描画の実際の様子をリアルタイムで撮ったビデオを作りました。
ビデオから分かる通り、セットアップはかなりシンプルで短時間で完了します。典型的な課題は良いアンカーポイントを見つけること。ホワイトボードでは、小さな吸盤に縫い糸のループを接着し、クリップでプロッターを吊るすのをよく使います。アンカーポイントの重要な点は、糸をできるだけ壁に近い位置に持ってくることで、ペンから壁への圧力を良くすることです。
もう一つの注意点は、広い描画で高い位置を描く場合。トルクが足りなくなるとステッパーがステップ欠けを起こし、エンコーダーがないためプロッターが正確な位置を見失います。一般的なアドバイス:高く吊るし、低く描く。






プロッターハードウェア
プロッターの構築は、他のArduinoプロジェクトとよく似ており、Arduino Uno、使いたいコンポーネント、それらを繋ぐケーブル類で構成されます。
回路図から分かるように、ほぼすべてのデジタルピンを使い、場合によってはアナログピンも使います(バッテリーレベル監視など)。ここで一つ注意点があります。ピン0-1はTX/RXを兼ねているため、ここに何かを接続していると、Arduinoプログラミング時にフライングする可能性があります。プログラミング時は接続を外す必要があります!これが、最近のプロッターでは電子部品をシールド化し、プログラミング時に簡単に取り外せるようにした理由です。
RCサーボは、どんなサイズ・種類でも基本的に使えます。プロッターを壁から押し離す(または押し離さない)ように創造的にマウントしてください。
ステッピングモーターとドライバーは他の種類に置き換え可能ですが、小型の28BYJ-48は非常に便利です。パワーはあまりありませんが、いつかもっと高速なプロッターを作りたいと思っています。モーター定格は5Vですが、5-9Vで問題なく動作させています。熱くはなりますが、まだ焼いたことはありません。
マイクロSDカードモジュールは、ArduinoのSPIインターフェースピンまたはデジタルピン10-13で簡単に接続できます。
IRレシーバーTSOP 4838もArduinoに直接接続して問題なく動作します。
3号機と4号機には、抵抗分圧でアナログ入力に接続したバッテリーレベル監視機能がありました。ステッパーの温度監視も同様に追加しようと思っていました。アドバイス:やめておきましょう。

一度に一つずつ構築・テストすることを強くお勧めします。すべて組み立ててSDにグラフィックを入れ、すぐに描画できることを期待しないでください。以下の順序を推奨します:
- まずIRレシーバーをテスト。IRRemoteライブラリ付属のIRRecvDump例を使用。リモコンのキーコード記録にも必要です
- サーボをテスト。例えばServoライブラリのSweep例を使用
- SDカードをテスト。SDライブラリの例で遊ぶ
- ステッパー制御をテスト。Stepperライブラリのサンプルで遊ぶ
- 上記パーツに慣れたら、プロッタープログラムをArduinoに書き込み、すべてのコンポーネントを接続(まだ組み立てず、綺麗にもしない)
- Arduinoに電源を入れて様子を見る。すべて動けば、起動直後にサーボが小さなスイープをするはず
- リモコンでステッパーを操作してみる。左右どちらのステッパーか確認。「REEL_IN」ボタンで実際に糸が巻き取られるか確認(逆の場合50%の確率で起きる。ソフトウェアかハードウェアでピン順をひっくり返せばOK。大したことではない、コネクタをひっくり返すだけ。信頼するが、検証せよ!)
- すべて自信が持てたら、プロッターらしく組み立てて壁に吊るして試す!
ここではパーツ組み立ての超詳細な手順は示しません。あなたのハードウェアを探求し、あなたに合った解決策を見つける方が良いです。「マクガイバー」プロッターにインスピレーションを受け、シンプルに保ちましょう。後で派手に完璧にすることはできます。下のビデオでハードウェアについて色々話しています。ソフトウェアと描画ファイルの作成にも慣れる必要があります、詳細は後述。
プロッターソフトウェア
すべてのソフトウェアはGitHubで公開しています。コードの状態は酷いもので、本当にハックの塊です。いつか時間をかけて綺麗にするかもしれませんが、おそらくその前にあなたが見ることになるでしょう。申し訳ありません。
プロッター上のソフトウェアは主に2つのことをします:
- リモコンからのナビゲーションとセットアップを可能にする
- SDカードに保存された.svgファイルの内容を描画する
Arduino Unoのプログラムメモリはかなり限られているため、コードをメモリに収めるために多くの醜いショートカットを取っています。これは特に、SDカードがなくグラフィックもArduinoに直接プログラムする必要があった最初のプロッターで顕著でした。.svgのパースは極めて限定的で、直線のみのパス(曲線なし)しか扱えず、Inkscapeで出力した特定の.svg方言を要求します。
.svgファイルはSDカードのトップレベルフォルダに1.svg、2.svg、という名前で保存します。描画するファイルはリモコンの対応するボタンを押して選択します。これでお気に入りをいくつか用意しておき、すぐにホワイトボードを飾れます。
Arduino IDEでビルド・プログラミングしています。追加ライブラリはIRRemote(by shirriff)のみです。
描画可能なファイルの作成
.svgファイルを作る方法は何百通りもありますが、ここでは一つだけ説明します:
- Inkscapeを使用
- 描きたいものを描き、「パス」→「オブジェクトをパスに」でパスに変換
- 「ノードでパスを編集(F2)」を選択
- すべての個別パスとノードを選択。Ctrl+Aを2回押す
- 「拡張機能」→「パスの修正」→「ベジェ曲線のフラット化」で直線に変換
- 「Inkscape SVG」として保存
- シミュレーターで実行(後述)
シミュレーター
もう一つ重要なものがあります。シミュレーターです。プロッターで試す前に、描画したいものはシミュレーターで実行することを強く推奨します(ほぼ必須)。.svgパースが貧弱なため、プロッターで正しく解釈されない可能性が高いためです。
シミュレーターは、プロッターコードをmacOSやLinux向けにコンパイルし、「digitalWrite」呼び出しをstdoutへの出力(タイムスタンプ、ピン、状態)に置き換え、それを可視化UIにパイプすることで動作します。
シミュレーターを書いたきっかけは、95%ほど進んだ2時間の描画がバグで台無しになったことでした。何が起きたか全く分からず、デバッグ方法が必要だと痛感しました。原因は、.svg内の一つの数値が異常な桁数の小数を持っていたことによるfloatパースバグでした(メモリに収まらないためライブラリ関数を使わず自前でパースしていました)。このバグのおかげでシミュレーターを作ることになりました。
開発中にシミュレーターを使うと大変便利です。リアルタイムよりはるかに高速で実行でき、実際の描画にかかる時間も出力されます。シミュレーターコードの隣にあるREADMEで使い方を説明しています。
今後の改善案
思いつくままにリストアップ:
- プロッター側での.svgパースをやめ、PC側でしっかりパースしてプロッター向けの良いフォーマットを作る
- より良いブレーキ処理。現在のソフトウェアは1つ先の線分しか読まないため、緩やかな曲線が急カーブになる場合に対応不足
- エンコーダーや何らかのフィードバックで、ステップ欠け時の迷子を防ぐ
- きれいなコードを書く
- WiFi対応コントローラーにして、リモコン代わりにスマホを使う
最後に
ここまで読んで分かる通り、このプロジェクトにはかなりの時間を費やしました(主にかなり前)。今でも遊ぶのは楽しいし、改善アイデア、新バリエーション、飾りたい壁は山ほどあります。でも単純に時間がない。他のプロジェクト、家族、仕事があります。
本当に望むのは、インターネットの素敵な皆さんがこれを読んで何かを得て、自分自身のプロジェクトのインスピレーションにしてもらうこと。自分でプロッターを作って動かす人が現れることも嬉しいです。
ミニマルなプロッターを作ることは成功したと思いますが、自分の目標だった10ドル以下には届きませんでした。でもパーツは安くなり続けているので、もう1年もすれば達成できるでしょう……
あ、もう一つ。スパゲッティコードで私を殺さないでください。共有するつもりで書いたコードではないのです。当時は壁に描くのに忙しく、コードなんてどうでもよかった。でもとにかく共有することにしたので、それを喜んでください。
Bon Voyage,
Fredrik
コード
Stringent - 壁面プロッターのコード、ドキュメント、CAD図面(GitHub)
カスタムパーツとエンクロージャ
ベース用の新しいSTLをアップロードしました。古いものはなぜか壊れていました。新しいベース:フットプリントが小さい→プリント時間短縮。サーボアクションはプロッターを壁から押し離すのではなく、ペンを動かす方式に変更。
回路図
シンプルな電子回路図
製造プロセス