はじめに
3D Touch は 3D プリンターのオートレベリング用タッチセンサーで、通常は 3D プリンターの制御基板に直接接続して使用します。
しかし、今回は Raspberry Pi の GPIO に 3D Touch を接続して Python スクリプトから PWM で 3D Touch を制御してみました。
環境
- Raspberry Pi 3 model B
- Raspbian GNU/Linux 9.4 (stretch)
- Python 3.5.3
ケーブル配線の確認
3DTouch からはサーボ用と思われるケーブルが 3本とスイッチ用と思われるケーブルが 2本の合計 5本出ています。
それぞれのケーブルの配線は [ Geeetech 3DTouch auto bed leveling sensor for 3D printer ] を確認すると以下のようです。
サーボ用と思われるケーブル 3本
- 茶色: GND
- 赤色: +5V
- 橙色: control signal
スイッチ用と思われるケーブル 2本
- 黒色: GND
- 白色: Z min
サーボを PWM で制御するための周期と周波数の確認
ググっても 3DTouch の PWM 周波数を見つけられませんでした。オープンソースの 3D プリンター制御基板は Arudino を使用している場合が多いので、まずは Arudino の Servo ライブラリを確認してみました。
https://forum.arduino.cc/index.php?topic=151645.0 を眺めてみると、Servo ライブラリソースコードの Servo.h で以下のように定義されており、
#define REFRESH_INTERVAL 20000 // minumim time to refresh servos in microseconds
周期は 20,000 μs でよさそうです。周波数は 1,000,000 μs / 20,000 μs = 50 Hz となります。
更に、オープンソースの 3D プリンター制御基板のファームウェア Marlin のソースコードを見てみても Marlin/servo.h に同じ定義がされているので 50 Hz であっているようです。
サーボを PWM で制御するための Duty 比の確認
3DTouch のプッシュピンを上げ下げするための Duty 比もググって見つけることができませんでした。しかし、3DTouch とほぼ同じ仕様と思われる BLTouch の仕様が https://reprap.org/forum/read.php?1,823443 に記載されていたのでこれを参考にしました。
3DTouch の動作 | PWM オンと思われる時間 | duty 比 ※ |
---|---|---|
Push-pin Down | 700μs | 0.035 |
Push-pin Up | 1,500us | 0.075 |
Self-test | 1,800μs | 0.09 |
Alarm Release | 2,200μs | 0.11 |
※ (PWM オンと思われる時間 μs) / (周期 20,000 μs) で計算
Raspberry Pi の GPIO で 3DTouch を操作
周波数と duty 比がわかったので Raspberry Pi の Python で 3DTouch を操作してみました。
まずは、pigpiod を起動しました。
$ sudo pigpiod
python3 の対話モード インタープリターを起動しました。
$ python3
以降は Pytho3 の対話モード インタープリターで実行しました。
PWM に使用する GPIO を定義しました。
>>> GPIO_PWM = 18
- 今回は GPIO 18 を 3DToch の control signal に接続しています。
周波数を設定しました
>>> PWM_FREQ = 50
3DTouch の各動作に対応する duty 比を設定しました。
>>> DUTY_PP_DOWN = 35000
>>> DUTY_PP_UP = 75000
>>> DUTY_TEST = 90000
>>> DUTY_ALARM_RELEASE = 110000
- pigpio は引数として duty 比に 1,000,000 を掛けた値を渡すようです。
pigpio モジュールのインポートやその他初期化をしました。
>>> import pigpio
>>> pi = pigpio.pi()
>>> pi.set_mode(GPIO_PWM, pigpio.OUTPUT)
試しにプッシュピンを下げてみました。
>>> pi.hardware_PWM(GPIO_PWM, PWM_FREQ, DUTY_PP_DOWN)
最後に pigpio リソースを開放して終了しました。
>>> pi.stop()