またもや、大陸から格安部品が届いた。SG90というサーボモータ。下のリンクはアマゾンの参考リンクですので実際に買ったのとは違います
このサーボモータ届いてから、調べて分かったんだけど、偽造品が大量に出ていて見分け方も掲載されている。こんなん、事前にはわからないよねw。異様に安いから嫌な予感はバシバシするけど・・・
真正品には、「Tower pro」の商標が、ケース上部にエンボス(浮き出し)で記載されています。
なるほど・・・調べてみると・・・
ありませーーーん!!w偽造品です。まぁ安かったしねぇ。今度から気を付けて買います。まぁ、このまま終わってもつまらないので偽造品の検証を進めます。
パクリ品だけど一応正規品のデータシートを見てみる
PWM信号は5Vなのね。ラズパイは3.3Vだからロジックレベルコンバータをかまそう。VCCにも5V、PWMはロジックレベルコンバータをかませてGPIOにつなげる。今回はGPIO12につなぐ
とりあえず、検索して一番多かった、LチカでおなじみRPi.GPIOを使った方法でPWM制御してみた。
というか、いつものことで手抜きだが・・・上のサイト様が作ってくれたSG90servoのクラスを使わせてもらった。実行部分で、クラスに追記したのは下の部分
1 2 3 4 5 6 7 8 9 10 |
sg90 = SG90servo(12) while True: sg90.servo_deg(-90) time.sleep(3) sg90.servo_deg(0) time.sleep(3) sg90.servo_deg(90) time.sleep(3) |
やはり、ピクピクしたり動作が不安定。うーん、パクリ品だから?w。
ちょっと、ここでPWMについて。PWMにはソフトPWMとハードPWMがあって、RPi.GPIOはソフトPWMらしいんだけど、どうもパルスの精度がラズパイの負荷によって若干変化するらしい。これによりサーボモータの異常動作が起こることが多いようだ。
対照的にハードウエアPWMってのもあってこれはハードウエアが生成するパルスを用いるので精度はとても良い。というわけで、検証には再度ハードウエアPWMで制御する必要がありそう。2つの方法があってWiringPiとpigpioのどちらかを使うらしい。
今回は、pigpioを使ってハードウエアPWMで制御しようと思う(理由はただ単に文献が多かっただけw)。ハードウエアPWMを使うにあたって、上のサイトにもあるように、ピンが決まっている。GPIO12を利用したのは、そういう理由からです。ただし、RPi.GPIOではGPIO12でも、ソフトPWMとなってしまう模様。
上のサイトを参考に、pigpioをインストールしカーネルを実行(sudo pigpiodを叩くだけ)すれば準備完了。参考サイトのサンプルコードを実行してみたけど、微妙に角度がズレるためキャリブレーションをして数値を補正しました。これは、まがい品が原因なのか、個体差なのかはわかりませんw。使う前に調整したほうがよさそう・・・。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/usr/bin/python # -*- coding: utf-8 -*- import pigpio import time pi = pigpio.pi() while True: #ここで-90 pi.set_servo_pulsewidth(12, 700) time.sleep(3) #ここで0 pi.set_servo_pulsewidth(12, 1520) time.sleep(3) #ここで90 pi.set_servo_pulsewidth(12, 2440) time.sleep(3) |
動作内容はRPi.GPIOのソフトPWMの内容と一緒。ピクピクしたり、振動する挙動がなくなった。このことからソフトウエアPWMが原因で動作が不安定になってたと考えられるね。一応、ロジックレベルに関してはPWM信号を5Vにしているので問題ないとは思う。