2019年7月27日土曜日

ESP32でラジコンサーボを動かしてみた

ESP32でTower ProのSG92Rっていうマイクロサーボを動かしてみた。秋月とかでも結構お安く売っている。Aliexpressだと一個250円ぐらいかも。

このサーボは4.8VなんだけどとりあえずUSBの5Vで動かしてみた。

今回はサーボ用のライブラリを使わずにESP32のPWM(ledc)だけで動かしてみた。サーボの標準的な通信は20ms周期の中でHighの割合が0.5ms~2.4msの間で角度が変化するようになってるのでESP32のPWMタイマーを50Hzにセットして0.5msから2.4ms相当のDutyで制御してみた。

#define servoPin 21 //入力Pin設定
#define servoPWMch 0 //サーボ用PWMチャンネル(0-15)
#define servoMin 102 //サーボ最小角度 0.5ms / 20ms * 4096(12bit)
#define servoMax 492 //サーボ最大角度 2.4ms / 20ms * 4096(12bit)

void setup() {
  Serial.begin(115200);
  ledcSetup(servoPWMch, 50, 12);//PWMタイマ初期化 0ch,50Hz(20ms),12bit
  ledcAttachPin(servoPin, servoPWMch);//PWMタイマに出力Pin割当
  //ledcWrite(servoPWMch, servoMin);//最小角度にセット
}

void setServo(uint8_t servoIn){
  uint16_t servoDuty = map(servoIn,0,255,servoMin,servoMax);//0-255で指定した角度をduty比に変換
  ledcWrite(servoPWMch, servoDuty);//指定角度にセット
}

void loop() {
  while (Serial.available() > 0)
  {
    char incomingCharacter = Serial.read();
    int val;
    switch (incomingCharacter)
    {
      case 's':
      {
        //Serial.print(incomingCharacter);
        val = Serial.parseInt();
        uint8_t servoOut = constrain(val, 0, 255);
        setServo(servoOut);
        Serial.println(val);
        break;
      }
      case 'S':
      {
        Serial.println(incomingCharacter);
        ledcWrite(servoPWMch, 0);//サーボオフ
        break;
      }
    }
  }
}
とりあえずこんな感じでシリアルコンソールでs0とかs255とか送れば0から255の間でサーボが0~180°の間で動いてくれる感じ。大文字のSを送るとPWM信号が止まるのでサーボもフリーになる。

ledcWriteを使えばLEDの調光やDCモータ制御だけじゃなくてラジコンサーボも動かせちゃうの便利だなぁ。一応16ch分タイマはあるっぽいのでこの単純なプログラムだけで16ch分は動かせそう。

2019年7月13日土曜日

ESP32用の自動書き込みアダプタを作ってみた。

前にESP-WROOM-02用に自動書き込みアダプタを作ったんだけど、ESP32-CAMとかのESP-WROOM-32にはうまく書き込めなかったので改良も兼ねて新しく作ってみた。
今回の改造ベースは秋月のFT232RQ USBシリアル変換モジュールキット。これも前回同様6Pinの出力だし、ピン配置も同じなのでベースとしてはいい感じ。USB端子もMiniUSBからMicroUSBになるし(これが大きいかも)。本当はTypeCが良かったなぁ

このモジュールは表面にDIPスイッチがあって3.3Vと5V切り替えたりLEDオンオフできたりするんだけど、今回はこちらのディップスイッチを外してそこに3.3Vレギュレータ設置できるかな。
ESP-WROOM-32だとリセットじゃなくてENを操作してるみたいなんだけど、タイミングによってはIO0がLOWになる前に立ち上がってしまったりして書き込みモードに入れないことがあるようなので起動遅延用にENとGNDの間にコンデンサを入れるといいらしい。

というわけで今回は前回の回路にコンデンサを一つ追加しただけ。
定数は環境にもよるらしいんだけど、0.1uFだと不具合が出ているような人がいるっぽいので念の為0.47uFにしてみた。1uFでも良さそう。

DIPスイッチ剥がせば全部表面に実装できそうだったので、DTRのパターンを途中でカットしてそこにトランジスタを載せてしまった。EN側のトランジスタの下で切れてコレクタはそのままパターン上にはんだ付けした。
RTSはICのピンからそのまま引き出した。ついでにFT232RQのCBUS4がLEDの近くだったのでLEDを駆動できるように改造した。FtProgでCBUS4のモードをTX/RXに変更すれば送受信時に点滅してくれる。
ちなみにDIPスイッチを剥がしてしまってもVIOは3.3Vに固定されるのでこのボードだと3.3V化はしなくてもオッケー。ダイオードを0Ωに変更しようか悩んだがとりあえずそのままで
レギュレータ用のコンデンサはディップスイッチの隣のVIAのところでパターンをカットしてそこに3.3Vを流せばいい感じにそのまま使えそう。

裏面にはわかりやすいように適当に印刷した紙をセロテープで貼って完成。
ESP32-CAMとかにつなぐときはEN端子が出ていないのでグラバークリップとかでENにつながってるコンデンサとかをつまむしかない…。
ESP-WROOM-02で使う場合はENをリセット品につなぐだけなので前と変わらず使える。
ESP32で3Mbps書き込みする場合はboards.txtを編集する必要がある。

CooltermのようにDTRの状態をいじれるターミナルを使えばPC側からリセットもかけられて便利だわー

2019年7月10日水曜日

Yinyoo BT4を買ってみた

iPhone 8のジャンクをお安く手に入れたので修理して使ってみてるけどイヤホン端子がない。ということで中華イヤホン用のBluetoothケーブルをこれまたジャンクで購入してみた。
MMCXではなくて2ピンタイプだった。

今回購入したのはYinyoo BT4のピン折れジャンク。
アマゾンの1/5以下ぐらいで手に入ったのでラッキー

片方はピンが折れて、もう片方は曲がってる。
とりあえず曲がった方のピンは真っ直ぐにして、折れてるところはヤスリで削ってから穴を開けた。


穴を開けたらそこに適当なピンヘッダのピンをはんだ付けして長さを合わせてハンダをデザインナイフで削って調整。


結構簡単に治ってラッキー。

Yinyoo BT4はCSR8645らしいのでApt-xとAAC対応してるみたい。
音質的には問題なさそう。音量も結構出てるのでハイインピーダンス系も行けそう。
とりあえずKZ ZSNで使用してるけど、端子の形状が微妙に違うけどピッチが同じなので刺さるからいいか

2019年7月6日土曜日

ESP32-CAMのサンプルスケッチを便利にしてみた

とりあえず技適対応のためにESP-WROOM-32に張り替えたり、ケースに入れたりしてそこそこ便利になってきたESP32-CAMなんだけど、面倒なフラッシュLED実装以外はほぼできたのでメモがてらおいておこうかな。
変更点はIO33につながってる赤色LEDを使えるようにWifiマネージャーのサンプルを移植。そしてmDNSで2台目つないだときにかぶらないように対策したぐらい。2台以降用に色々いじってみたものの変数をMDNS.begin()に入れるとうまく設定できなかったので…
WiFiマネージャーで設定したときに接続できないのもソフトリセットで対応…
本体のストリームもAsync対応させたいなぁ
以下サンプル編集したやつ。どこ編集したかわからなくなったのでメインのスケッチだけコピペしておいた。