2021.1.24: 引っ張り出して来て触ってみた
200円ほどでamazonで買ったdigispark でサーボを動かしてみる。
方針
- fast pwm modeを使ってみる
参考 - PB0とPB1で2つのサーボを制御する
- attiny85のTimer0を使う
- PB0: OC0A, PB1: OC0B
- clock 16MHzなのでPWMの周期は16000000/1024/256=61Hz(16.4ms)になる
(一般的なサーボの駆動は50Hz(20ms)) - サーボへのパルス幅は1.5±0.5msなので、制御可能なレジスタの値は24±8
-> 実制御して確認したら8〜36までは動いた(150度くらいの変域になる)
(ヌルヌルとは動かない、周期を短くしてもサーボが動くならば細かくできるけど、、、今後の課題)
材料
-
digisparkのバッタモン (動かなかったのでチップ交換して最新のmicronucleusを焼いてある)
-
- 赤:VCC -> 5V
- 茶:GND -> GND
- 橙:PWM -> P1につなぐ
注意点
- MacBook Mid 2009 (El Captin) + Arduino 1.6.13ではUSB Hubを使わないと書き込みができなかった
-> USB延長ケーブルを使えば認識できそう - Edison(ubilinux)ではudev ruleを追加しないといけない 参考
(追加しておかないと、arduino IDEでもmicronucleusでもうまくいかない) - delay()は使えないので、
# include <until/delay.h>
# define F_CPU 16000000
...
_delay_ms(1000);
を使う
- pinMode(1, OUTPUT)が必要
レジスタの設定
- TCCR0A
- COM0A = 2 (fast pwm mode, OC0A enable)
- COM0B = 2 (fast pwm mode, OC0B enable)
- WGM0 = 3 (fast pwm mode, 0xFFで1周期)
- TCCR0B
- WGM02 = 0 (fast pwm mode, 0xFFで1周期)
- CS0 = 5 (プリスケーラ 1024)
- OCR0A :
PB0の出力のdutyを設定 - OCR0B :
PB1の出力のdutyを設定
ソースコード
ino
# include <avr/io.h>
# include <util/delay.h>
# define F_CPU 16000000
# define COM0A 6
# define COM0B 4
# define WGM0 0
# define WGM02 3
# define CS0 0
void setup() {
// put your setup code here, to run once:
/*
TCCR0A
COM0A = 2 (fast pwm mode, OC0A enable)
COM0B = 2 (fast pwm mode, OC0B enable)
WGM0 = 2 (fast pwm mode, 0xFFで1周期)
TCCR0B
WGM02 = 0 (fast pwm mode, 0xFFで1周期)
CS0 = 5 (プリスケーラ 1024)
*/
TCCR0A = (2 << COM0A) | (2 << COM0B) | (3 << WGM0);
TCCR0B = (0 << WGM02) | (5 << CS0);
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
OCR0B = 16;
_delay_ms(2000);
OCR0B = 24;
_delay_ms(2000);
OCR0B = 32;
_delay_ms(2000);
OCR0B = 24;
_delay_ms(2000);
}