satotsuのいろいろつくってみた日記

いろいろつくってみたあれこれの記録。

arduinoで相補PWMだしてみる。

arduinoでも相補PWM出せるよね。ということで試してみた。

 

これが一応最終形。オシロが1chしかないので、PWMの出力2つをつまんでる。

deadtimeと相補PWMでてるっぽい。1kHz。

f:id:msatotsu:20171229204739j:image

 

でも信号の切り替わりを拡大してみると、変なレベルがでてる。-2.5Vくらいのやつ。なんだこれ。

f:id:msatotsu:20171229205034j:image 

 

こいつのせいで、10kHzでdeadtimeを0にしても変な段つき波形になる。。

f:id:msatotsu:20171229205133j:image

 

一応ソースのせとく。timer1を使ってる。

 

#include <avr/io.h>
#include <avr/interrupt.h>

void PWM_init(uint8_t ch, uint8_t N, uint16_t top) {
// 0:in, 1:out, DDRB,DDRD: DIO, DDRC: AnalogIn
// timer0->PD6,5, timer1->PB1,2, timer2->PB3,PD3
DDRB = DDRB | B00000110;


// COM1x1,COM1x0: duty, 10: OCR1/TOP, 11:1-(OCR1/TOP)
TCCR1A = TCCR1A & ~(bit(COM1A1)|bit(COM1A0)|bit(COM1B1)|bit(COM1B0));
TCCR1A = TCCR1A |bit(COM1A1)|bit(COM1B1)|bit(COM1B0);
TCCR1B = (TCCR1B & B11100000) | bit(WGM13) | N;

TCNT1 = 0;
TIMSK1 = bit(TOIE1);
ICR1 = top;
OCR1A = 2000; // deadtime 0.5us -> 0.5us/50us*800=8
OCR1B = OCR1A - 1000;
}

void setup() {
noInterrupts();

TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;

PWM_init(1, 1, 8000);

interrupts();
}

ISR (TIMER1_OVF_vect) {
} void loop() { // put your main code here, to run repeatedly: }

arduinoめも

今さらだけど、arduinoってなんだっけとか、タイマとか割り込みってどうなってるんだっけ、とか気になるのでめも。

 

arduinoは、AVRに基板とIDEをセットにしたものみたい。

AVRのことではなかった。ハードはなんとオープンソース

だからびんぼうでいいのとかできるんだね。

Arduino - Wikipedia

 

タイマーは、AVR自体はtimer0,1,2あるんだけど、arduinoでは、

MsTimer2 → ms

TimerOne → us

でアクセスするらしい。あれ?timer0は??

miso-engine.hatenablog.com

 

 タイマの関数の引数に呼び出す関数を入れるみたい。

 ちなみに割り込みベクタは固定。優先度高い順に、timer2,1,0。

 

タイマとピンの対応はこちらを参考にさせていただく。

そうそう、◯◯といえば : Arduino の PWM と タイマーと tone() 関数

 

IOアクセスが遅そうというのはその通りで、ここで調べてる方がいた。

digitalWriteおそい。でも144kHzでるなら、往復7usくらいなので普通は問題ないかも。

ehbtj.com

 

どうしたら良いかというと、digitalWrite使わずに、レジスタ直接書き換えたらいい。

というか、こちらの方がわかりやすいと思うのは自分だけではないはず。。

cammy.co.jp

 

ならタイマもレジスタ書けばいろいろできるんでは。

と思ったら、ものすごくわかりやすくまとめてるところがあった。感謝。

analogWrite()[Arduino 1.0.5]

 

こちらも参考に。

usicolog.nomaki.jp

 

タイマ割り込みのこと忘れてた。ここを参照させてもらお。

makers-with-myson.blog.so-net.ne.jp

 

割り込み要因はこちらで。

usicolog.nomaki.jp

OLEDモジュール128x64, SSD1306, びんぼうでいいので動かす

ひさしぶりのarduino

aitendoでOLEDモジュールが500円で売ってたので、ちょっと動かしてみたく。

こんな感じ。

f:id:msatotsu:20171226211223j:image

 

今回買ったのはこれ。OLEDモジュール(0.96/白色/I2C) [M096P4W]。

www.aitendo.com

 

スケッチを作るのに参考にしたのは、こちら。電圧は3.3VでOK。

ただし今回のOLEDモジュールだと、i2cのアドレスを変えないとダメ。

qiita.com

で、同じOLEDモジュールを使ってた方がいたので参考にさせていただく。

0X3Cなのです。

mohran.hatenablog.com

この調子でsplatoon2の絵を出してみたい。(みんなやりたいことは一緒。)

その後はsplatoon2の中できっと絵を描いてみたい。

アームクローラーにツインモーターギヤーボックスつけてみた。

アームクローラー工作セットの説明書に、ツインモーターギヤーボックスと2チャンネルリモコンボックスつけて、リモコン操縦に変えてみようってあったのでやってみた。

 

これは表。標準なのでスイッチがついてる。

f:id:msatotsu:20170828212642j:image

 

これは裏。標準のギヤボックスなのでモーターと電池は1つずつ。

f:id:msatotsu:20170828212726j:image

 

これをツインモーターギヤボックスに取り替え。

f:id:msatotsu:20170828213019j:image

 

単純に2倍の速さになるのかと思ったら、前と変わらない。。ん。。

落ち着いて考えればわかるけど、別にモーター2個になっても速くなるわけない。トルクは2倍だろうけど。

 

ちなみにリモコンボックスは、ブルドーザーから拝借した。

f:id:msatotsu:20170828213344j:image 

 

そしてこのブルドーザーよりアームクローラーはめっちゃ遅い。

それもそのはず、ギア比が全然違った!!

 

ブルドーザーはBタイプなので、58:1。

アームクローラーはCタイプなので、203:1。

 

3倍以上違う!!

 

なので、アームクローラーはAタイプにしたら普通に速くなりそう。

(AとBはギヤ比同じでシャフトの高さが違う。)

ネジ穴がないからちょっと考えないと。。

あー、ギヤボックスがシャフト支えてくれるから大丈夫か。

→Aタイプにしたら速くなったものの、履帯を伸ばさないといけなくなって、10を外して8を2個つけたら長すぎででろんでろんになった。

ベース車をブルドーザーにしたアームクローラーにした方がいいかも。

 

あと、アームクローラーがうるさいのは、ギアがカタカタとM4シャフトに当たってるからかな。。取っちゃうか。

→取っても変わらなかった。。

 

モータシールドめも

モータドライブシールド。adafruit互換。

シールドは基板化されてるので配線気にしなくて良いのが楽だよね。

www.aitendo.com

 

電源周りの回路図。推奨はジャンパーを外して、モータは別電源で。

https://cdn-learn.adafruit.com/assets/assets/000/001/897/medium640/adafruit_products_mshielddiag.png?1396777234

 

本家ボード(adafruit)の写真。DCモータなら4つまでつなげられるよ。

https://cdn-learn.adafruit.com/assets/assets/000/001/854/medium640/adafruit_products_DC_Motor_Ports.gif?1447864310

DCモータの動かし方は、ここから。すごい簡単。

Using DC Motors | Adafruit Motor Shield | Adafruit Learning System

ライブラリはここから。でも普通にarduino IDEからダウンロードできたような。

v2じゃないことに注意。

Overview | Adafruit Motor Shield | Adafruit Learning System

 

この後、DCモータをいろんなチャンネルにつないでみたら、ch1だけ動かない。。

arduinoからモータシールドまでは問題ない。

L293Dからモータまでも大丈夫。

んー、と、L293Dを交換してみたら動いた。

 

どうやら初期不良だったっぽい。aitendoさん、交換してくれた。

ちなみに使っているポートは下記の通り。(adafruitのFAQより。)

Digital pin 2, and 13 are not used.

The following pins are in use only if the DC/Stepper noted is in use:
Digital pin 11: DC Motor #1 / Stepper #1 (activation/speed control)
Digital pin 3: DC Motor #2 / Stepper #1 (activation/speed control)
Digital pin 5: DC Motor #3 / Stepper #2 (activation/speed control)
Digital pin 6: DC Motor #4 / Stepper #2 (activation/speed control)

The following pins are in use if any DC/steppers are used
Digital pin 4, 7, 8 and 12 are used to drive the DC/Stepper motors via the 74HC595 serial-to-parallel latch

The following pins are used only if that particular servo is in use:
Digitals pin 9: Servo #1 control
Digital pin 10: Servo #2 control

 

そしてやっぱりモータシールド経由だとパワーも速度も出ない。

L293Dの出力が最大600mAなのに、モータがたぶん2Aくらい欲しがってる。

dutyをMAXにした瞬間、電圧がだだ下がってる。モータを外部電源にしたのに。

そもそも部品選定間違ってるな。。

タミヤ カムプログラムロボット工作セット

タミヤから出た、カムプログラムロボット工作セット。

8/12発売なのに、もう売り切れてるし!!

カムプログラムロボット工作セット

 

なにがすごいって、まずこの価格。税込みで3500円以下!

プログラムがプログラムバー(レゴみたいなの)でできる!

しかもArduinoとか、RaspberryPiとか、IchigoJamも搭載できる!

 

なんだこれ。なんでこの値段でこんな面白いおもちゃが。

 

なんか他のパーツと組み合わせたら、ラジコンにもなるとか。

http://www.tamiya.com/japan_contents/img/usr/item/pdf/70227_flyer.pdf

 

再販はよ!!

LEGO WeDo

最近、子ども向けのプログラミング教室とか増えてきてる。

そこで使われてるのが、例えばこのLEGO WeDo。教材だけでも市販されてた。

 

www.ev-3.net

マインドストームより半額くらいの3万円。海外通販だともうちょっと安く買える。

何より良いのが、iPadでプログラミングできるところ。

言語はGUIのオリジナル?(Scratchよりも使いやすそう?)

iPadだと無料でダウンロードできた。

1万円ちょっとになれば欲しいんだけどなぁ。

 

電子工作だけじゃなくて、LEGOと組合せっていうのがミソだと思う。