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);
}