2019年6月16日日曜日

Raspberry Pi の GPIO で 3DTouch を直接操作

3DTouch

3DTouch

はじめに

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()