Arduinoを用いたドット絵ペンプロッタを作成する_その１

# はじめに
<!-- 発端や概要を記載 -->
何か実用的な作品を作りたい、というモチベーションから、Arduinoを用いたペンプロッタを作成しました。
せっかくなので作品紹介を兼ねて、他の方の作品制作のアイデア出しのヒントになれば、電子工作を始めたばかりの方の道しるべになれば、ということで記事を初投稿していきます。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [作品の概要](#Overview)
1. [おおまかな仕様](#Spec)
1. [使用する電子部品](#Parts)
1. [次回](#Next)

<!-- 各チャプター -->
<a id="#Overview"></a>
# 作品の概要
ステッピングモーターを使ってボールペンを固定したプロッタステージをx/y軸方向のいずれかに動かし、サーボモーターでペンを上下に動かすことで描画を行います。
ペンの打点間隔を調整することでグレースケール4諧調の濃淡表現をします。

![PXL_20220504_071252787.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870703/9eb25687-8541-e09d-1832-0eaaabdc0f4e.jpeg)



<a id="#Spec"></a>
# おおまかな仕様
ペンプロッタというと、画像のエッジ抽出を行って、輪郭を描画するスタイルが一般的かと思いますが、今回はドット絵の要領で、ペンを紙に押し当てて打点を繰り返しながら描画を行う"ドット絵方式"での作成を目指します。

CNCマシンの作成にあたっては、オープンソースソフトウェアであるGRBLを使用するケースが多いようです。GRBLはCNCマシンに対する命令コード(Gコード)を生成するためのツールです。(GRBLについては[こちら](https://101010.fun/iot/arduino-grbl-v0_9-cncjs-install.html)が分かりやすかったです。)
詳細はソフトウェア実装の記事で述べますが、前述のドット絵方式では複雑なモーター制御が不要であるため、GコードやGRBLは使用せず、敢えて命令コマンドも自分で用意し、Arduino側で命令デコード&駆動を行うことにします。

画像の事前処理や命令コードの変換はPythonで行い、シリアル通信で命令コードをArduinoに送信し、逐次デコードする仕様で考えていきます。

<a id="#Parts"></a>
# 使用する電子部品
主要な部品のみです。
めっちゃ適当です、すみません。

| No |    内容     |    備考    |
|---:|-------------|------------|
| 1  |Arduinoボード |最近は半導体不足で値上がりしてますね。今回はArduino nano互換品を使っています。            |
| 2  |NEMA17 *2            |比較的安価なステッピングモータ。x/y軸方向のプロットステージ駆動用に使います。            |
| 3  |A4988搭載モータードライバ *2            |モータードライバモジュール。ステッピングモーターを駆動するのに使います。|
| 4  |SG90            |安価なサーボモーター。ペンを上下させるためのアクチュエータとして利用します。|
| 5  |NJM7805FA            |5V出力の三端子レギュレータ。サーボモータへの電力供給用です。|
| 6  |可変抵抗            |サーボモータの駆動角度のコンフィグレーション用。抵抗値は低すぎなければ(>1kΩ)適当でOK。|
| 7  |12V電源            |モーターへの電力供給用。モータードライバ側で供給電流の上限を設定できるので、この値よりも多めの電流供給能力をもつ電源を用意しましょう。詳細は下のA4988補足の項目で。|


- ノイズ抑制用のコンデンサや、装飾のためのLEDなどは省略しています。
- タイミングベルトやヒートシンク、ボールペン等の非通電部品は省略しています。

### 補足 モータードライバ
 A4988搭載のモータードライバモジュールのみ補足をしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870703/92812c02-02d9-9df0-baac-a034c68f6538.png)

| pin |    内容     |    備考    |
|---:|-------------|------------|
| GND  |グラウンド |ロジック/モーター用のグラウンドを接続。            |
| VDDL  |ロジック用電源(5V)            |Arduinoの5Vピンに接続。            |
| VDDM  |モーター用電源(12V)            |12V電源に接続。隣のGNDピンとの間に100uF程度のコンデンサを挿入すること。|
| A1,A2,B1,B2  |ステッピングモーター励磁用            |A1とA2、B1とB2が互いに対応するようにステッピングモーターのコネクタを接続する。メーカによってステッピングモーターの配線(コネクタ)の色や順番が異なっているので、仕様書を読みながら実験して正しい接続を確認することを推奨。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870703/e8dbe751-cf52-7cf2-a1c7-c346ca0f7f88.png)<br>例えば上のメーカの仕様書の場合、A1:Black、A2：Green、B1：Red、B2:Blueに接続すればOKです。|
| DIR  |回転方向制御            |HIGH/LOW入力で回転方向の正転/逆転を制御する。そもそもA1～B2までの配線を入れ替えれば回転方向も逆転するため、A1～B2の接続と合わせて回転方向を確認しておくこと。|
| STEP  |ステップ値制御            |パルス印加で1ステップだけモーターを回転させる。1ステップ幅(回転角度)はMS1~MS3ピンで制御することができる。|
| MS1,MS2,MS3  |マイクロステップ制御            |各ピンは内部プルダウンされており、何も接続しなければ全てLOW：フルステップ駆動になる。これを例えば全てHIGHにすると1/16ステップ駆動となり、フルステップ駆動時に対して回転角度が1/16になる(同じ角度を回転させせるために16倍のステップが必要になる)。1/16ステップ駆動のほかにも1/2とか1/8ステップ駆動がある。フルステップ駆動は回転速度が早いがトルクが小さい(電流を多く流せばトルクは増すが、消費電力は増える)。1/Nステップ駆動だと動作は遅いがトルクが強い。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870703/d9b99ab6-b3fe-5529-c636-5f05ad447229.png)
| /EN,/SLEEP,/RST  |イネーブル,スリープ,リセット制御            |それぞれ、ドライバのイネーブル、スリープ、リセット用。負論理であるため、モーター駆動時はENはLOWに、SLEEPとRSTはHIGHにしておく。今回は動的にドライバのオンオフ制御をすることはしないので、各ピンのレベルは固定する。SLEEPは内部プルアップされているので、SLEEPとRSTを直接接続すればOK。ENはGNDに直接接続する。|
| #  |電流制限用ネジ            |モジュール表面についているネジを回すことで、モーターに流す電流の上限値を制限できる。ロジック電圧を供給した状態でネジを回しながらネジの電圧を計測すると電圧が変動するのが確認できる。この電圧をV_refとする。詳細は割愛するが、I_max = 2.5 * V_refで与えられる電流値がモーターに流れる電流上限値になる。例えばV_ref＝0.4 V とした場合、電流は最大でも1.0 Aまでしか供給されない。"2.5"という数値はモジュール内部で使用している抵抗に依存した量であるので、仕様するドライバの仕様書を見て計算式を確認すること。|

電流制限については、電流が少なすぎるとトルク不足でプロッタステージを動かせなくなり、多すぎると12V電源(ACアダプタ)のスペックをオーバーするため、実験的に必要な電流量を見極めます。
今回のペンプロッタでは2基あるステッピングモーターは必ず排他的に使用する(同時に2個動かすことがない)ため、2基モーターがあるから必要な電流容量スペックもI_maxの2倍、というわけではなく、片方のモータードライバ側のI_maxに対して50%程度のマージンをもたせた値よりも12V電源の電流容量が大きければ(1.5 * I_max < I_spec)問題ないと思います。自分の場合は0.8 Aを上限値に設定したので、かなり余裕をみた12 V/2 AのACアダプタを電源として採用しています。

- より詳細な仕様や制御についてはA4988/ドライバモジュールの仕様書をご確認ください。


<a id="#Next"></a>
# 次回
当初は1個の記事に全てまとめようと考えていましたが、思っていたよりもボリュームが大きそうなので、記事3個程度に分割しようかと思います。
次回はハードウェアの実装について書く予定です。

記事投稿は初めてなのでかなり読みにくい記事になってしまっていると思います。ここまで読んでいただきありがとうございました。