Robot(2)2016年03月07日

サーボ制御

ロボットアームの制御はWiFiモジュールESP-01(プログラムはArduino)で行います。Arduino単体でも12個のサーボを制御できますが制御画面などを作成するにはさすがに限界があります。Arduinoなら使用するライブラリーはServoライブラリーで簡単に制御できます。このライブラリーは使用方法は簡単なのですが、動作時間を制御できません。例えばアームを90度回す動作を1回で行うとすごい勢いで回りアームが転倒してしまいます。そこで動作時間が指定できるライブラリーを探しました。世の中には同じ悩みを持っている方がいるのですね。VarSpeedServoというライブラリーです。このライブラリーでは指定角度を動かす時間も指定できます。アームの上下動作、アームの回転動作、グリッパーの開閉動作の動作時間を変えることができます。このライブラリーが利用できるのはArduinoで制御する場合です。現在のところWiFiモジュールESP-01を使用してI2C経由でサーボを操作する場合には使用できません。WiFiモジュールESP-01を使用する場合はAdafruteが公開しているライブラリーになります。指定角度を動かすことはできますが時間指定ができません。
ロボットアームコントローラーの回路図です。

Robot(3)2016年03月18日

制御ソフト

コントローラーにはWiFiモジュールESP-01を使用していますが、ソフトウエアの開発はArduino開発環境で行えます。このロボットアームコントローラーにはWiFiアクセスポイント、WEBサーバー、WEBサービス(ここがサーボ制御指示を受け取ります)の3機能とサーボ制御のファームウエアを内蔵させました。これでWiFi接続できるスマホやタブレットからでもWEBブラウザさえあればロボットアームが操作することができます。
サーボ制御のファームウエア
WiFiモジュールESP-01のハードウエアではGPIOが2個しか出力されていませんので2個のサーボしか制御できません。そこでI2Cという通信方式を使用してPCA9685サーボドライバーICで制御できるサーボ数を拡張します。このドライバーICを使用することでサーボをドライバーIC1個につき16台まで動作させることができます。サーボ制御ドライバーはAdafruteが公開しているライブラリーが使用できます。あとは急激な動作をしないようにプログラムで制御することでサーボの基本動作とします。実際には現在の位置から指定位置まで1度刻みで一定時間間隔のインターバルをもたせた連続動作にすることで実現しています。

// 引数はサーボ番号、移動先、移動元
void servo_write(int n, int ang, int npos){
  int degrees;
  uint16_t pulselen;

  if (npos < ang) {
    for (degrees = npos + 1; degrees <= ang; 
                 degrees++) {
      pulselen = map(degrees, 0, 180, SERVOMIN, 
             SERVOMAX);
      pwm.setPWM(n, 0, pulselen);
      delay(10);
    }
  } else if (npos > ang) {
    for (degrees = npos - 1; degrees >= ang; 
                  degrees--) {
      pulselen = map(degrees, 0, 180, SERVOMIN, 
             SERVOMAX);
      pwm.setPWM(n, 0, pulselen);
      delay(10);
    }
  }
}
ユーザーインターフェース
WiFi動作はアクセスポイントモードにしているのでインターネットに接続しているWiFi環境は必要ありません。スマホやタブレット、PCから作成したSSIDにWiFi接続すると専用のネットワークに接続され、192.168.4.1にアクセスするとプログラムに内蔵したWEBサーバーがロボットアーム制御のためのHTML画面を表示します。WiFiモジュールESP-01はArduinoと比較すると格段と高機能です。32ビットMPU、WiFi機能以外に搭載メモリーがたくさんあるので画面のHTMLはすべてプログラムに直接書き込んでいます。LCD表示機能を追加してもまだメモリーに余裕があるので画面をもう少しリッチに仕上げることができそうです。このHTML画面はjavascriptのXMLHttpRequestを使用したシングルページアプリケーション構成になっています。ページ移動をせず画面上のスライダー値をWiFiモジュールESP-01に各サーボの制御情報として送信し指定のサーボを動作させます。また、動作ログを記録しており、ログから自動実行スクリプトを作成し、一連のサーボ制御情報を自動実行する機能(シーケンサー)も組み込んでいます。このシーケンサーは作成されたスクリプトを1行づつ非同期処理で順次WiFiモジュールESP-01に送信することで実現します。

久しぶりのRaspberry Pi2016年03月27日

Raspbian 8.0

この3月にRaspberry PiのOSであるRaspbianの最新版(Jessie)がアップデートされました。だからというわけではないのですが以前からVPNサーバーが定期的にダウンするという現象の原因がわからず悩んでいたので、Wheezyから新しい版のJessieで再作成することにしました。以前に紹介している温度センサーを接続しているサーバーです。今は出歩くことが減り家にいるのでVPNサーバーの必要性も薄れていることもありVPNサーバーは廃止し、I2CやGPIOのテスト機として再スタートです。Raspberry PiはSDカードさえ作り直せばどのような環境でも再作成が可能な所が良いです。

  • 基本OSにRaspbian jessie 8.0を使用する
    Linux 4.1.19になります。
  • 8GB SDカードにイメージを書き込む
    4GBではぎりぎりになってしまいます。
  • Raspbianの設定
    ネットワーク→ホスト名の変更、固定IPアドレス
    ローカル設定→使用言語、タイムゾーン、キーボード
    その他の設定→I2Cの使用
    日本語フォントのインストール
  • 追加ソフトウエア
    python-smbus
    i2c-tools
    digitemp
    lcdi2c

新OS上ではダイナミックDNSサーバーへIPアドレスを登録するスクリプト、室温と外気温をクラウドサーバーへデータ登録するためのスクリプト、接続した16桁2行キャラクターLCDへ日付曜日、時刻の表示が今のところcronに登録する定期実行JOBになります。Raspbian jessie 8.0からWiringPiは標準でインストールされていますのですぐにGPIOを使用できます。WEBブラウザからでも操作できるようにWebIOPiをインストールしました。WebIOPiなら別にhttpサーバーをインストールする必要がありません。このサイトを参考にしました。