diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 7ff378d..0dd5036 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -11,6 +11,8 @@ - [渐显/渐隐LED](./ch24_fading_a_led.md) - [读取模拟电压](./ch25_read_analog_voltage.md) - [编写millis()函数](./ch26_write_millis_function.md) + - [LED灯带](./ch27_range_for_led.md) + - [控制舵机](./ch28_servo_control.md) - [数字](./ch3_digital.md) - [无延迟闪烁](./ch31_blink_without_delay.md) - [如何对按钮进行连线和编程](./ch32_how_to_wire_and_program_a_button.md) @@ -24,12 +26,10 @@ - [创建LED调光器](./ch51_create_a_led_dimmer.md) - [读取ASCII字符串](./ch52_read_ascii_string.md) - [具有ASCII编码输出的串行调用和响应(握手)](./ch53_handshaking_with_ascii_encoded_output.md) -- [中断](./ch6_interrupt.md) - - [LED灯带](./ch61_range_for_led.md) -- [传感器](./ch7_sensor.md) - - [温度报警器](./ch71_temperature_alarm.md) - - [震动探测](./ch72_detecting_vibration.md) - - [感光灯](./ch73_photosensive_light.md) -- [应用](./ch8_application.md) - - [交通信号灯](./ch81_traffic_light.md) +- [传感器](./ch6_sensor.md) + - [温度报警器](./ch61_temperature_alarm.md) + - [震动探测](./ch62_detecting_vibration.md) + - [感光灯](./ch63_photosensive_light.md) +- [应用](./ch7_application.md) + - [交通信号灯](./ch71_traffic_light.md) \ No newline at end of file diff --git a/src/ch61_range_for_led.md b/src/ch27_range_for_led.md similarity index 100% rename from src/ch61_range_for_led.md rename to src/ch27_range_for_led.md diff --git a/src/ch28_servo_control.md b/src/ch28_servo_control.md new file mode 100644 index 0000000..5d7311f --- /dev/null +++ b/src/ch28_servo_control.md @@ -0,0 +1,40 @@ +# 控制舵机 +控制舵机旋转 + +舵机是一种电机,它使用一个反馈系统来控制电机的位置。可以很好掌握电机角度。大多数舵机是可以最大旋转180°的。也有一些能转更大角度,甚至360°。舵机比较多的用于对角度有要求的场合,比如摄像头,智能小车前置探测器,需要在某个范围内进行监测的移动平台。又或者把舵机放到玩具,让玩具动起来。还可以用多个舵机,做个小型机器人,舵机就可以作为机器人的关节部分。所以,舵机的用处很多。 + +由于avr-hal没有像C那样提供9G舵机的类库,所以,在本示例中,我们需要手动编写一个控制它。本例使用的9G舵机可以在旋转180度。根据舵机数据表,该舵机使用PWM控制,位置“0”(1.5 ms 脉冲)位于中间,“90”(~2ms 脉冲)位于一直向右的位置,“-90”(~1ms 脉冲)一直向左。 + +## 硬件要求 +- Arduino板卡 +- Micro Servo 9G舵机 +- 连接线 + +## 电路 +按照舵机的数据表,舵机有棕红橙三根不同颜色的线,分别对应GND、+5V和PWM控制信号,控制信号我们选引脚9。 + +在计时器的每个时钟周期递增。当计数器达到存储在比较匹配寄存器中指定值时触发CTC定时器中断。一旦定时器计数器达到该值,它将在定时器时钟的下一个定时器上清零(复位为零),然后它将继续再次计数到比较匹配值。通过选择比较匹配值并设置定时器递增计数器的速度,你可以控制定时器中断的频率。 + +Arduino时钟以16MHz运行。计数器的一个刻度值表示1 / 16,000,000秒(~63ns),跑完1s需要计数值16,000,000。 +1. Timer0和timer2是8位定时器,可以存储最大计数器值255。 +2. Timer1是一个16位定时器,可以存储最大计数器值65535。 + +关于定时器的解释 +一旦计数器达到其最大值,它将回到零(这称为溢出)。因此,需要对时钟频率进行分频处理,即预分频器。通过预分频器控制定时计数器的增量速度。预分频器与定时器的计数速度如下: +|CS0|CS1|CS2|描述 +|---|---|---|---| +|0|0|0|没有时钟源(定时器/计数器停止)| +|0|0|1|未分频| +|0|1|0|8预分频| +|0|1|1|64预分频| +|1|0|0|256预分频| +|1|0|1|1024预分频| +|1|1|0| + + +### 电路图 +![控制舵机](images/servo-connection.png "控制舵机" =400x) + +## 代码 + + diff --git a/src/ch71_temperature_alarm.md b/src/ch61_temperature_alarm.md similarity index 100% rename from src/ch71_temperature_alarm.md rename to src/ch61_temperature_alarm.md diff --git a/src/ch72_detecting_vibration.md b/src/ch62_detecting_vibration.md similarity index 100% rename from src/ch72_detecting_vibration.md rename to src/ch62_detecting_vibration.md diff --git a/src/ch73_photosensive_light.md b/src/ch63_photosensive_light.md similarity index 100% rename from src/ch73_photosensive_light.md rename to src/ch63_photosensive_light.md diff --git a/src/ch6_interrupt.md b/src/ch6_interrupt.md deleted file mode 100644 index 4f57665..0000000 --- a/src/ch6_interrupt.md +++ /dev/null @@ -1 +0,0 @@ -# 中断 diff --git a/src/ch7_sensor.md b/src/ch6_sensor.md similarity index 100% rename from src/ch7_sensor.md rename to src/ch6_sensor.md diff --git a/src/ch81_traffic_light.md b/src/ch71_traffic_light.md similarity index 100% rename from src/ch81_traffic_light.md rename to src/ch71_traffic_light.md diff --git a/src/ch8_application.md b/src/ch7_application.md similarity index 100% rename from src/ch8_application.md rename to src/ch7_application.md diff --git a/src/images/servo-connection.png b/src/images/servo-connection.png new file mode 100644 index 0000000..cb37d2f Binary files /dev/null and b/src/images/servo-connection.png differ