本帖最后由 gada888 于 2021-4-30 23:56 编辑
引言: Arduino做的各种应用广泛被开源硬件爱好者喜欢。今天给大家介绍一个互动性强的arduino做的小船,特别适合五一户外娱乐,这个项目与众不同之处是电机的控制用了继电器,而不是用的电机控制模块。这个创意最初是看到了国外的instructable里的一个项目,可惜原文里没有提供代码和连线图,于是就想复盘一下,刚好我本来就想写个小船代码,正好把小船底盘用上。玩嘛,创造的乐趣是一般人想象不到的。 原文链接如下: https://www.instructables.com/Wind-Boat/
第一步:展示内容 人从微波传感前经过后,伺服和水泵同时工作。一个转角度,一个喷水。
第三步:硬件搭建 所需器材: 序号 | 名称 | 数量 | 1 | DF Romeo UNO | 1 | 2 | 四联继电器 | 1 | 3 | 红外接收器 | 1 | 4 | 小船底盘 | 1 | 5 | 小船电机 | 2 | 6 | | | 7 | | |
第五步: 发一些硬件的图片。让人有个直观的认识 、最初是用arduino nano和led做的测试, 内部连线 准备下水实测 第六步:关键步骤 代码上传之前,首先要知道遥控的发送器发出的码值。
- #include <IRremote.h>
-
- const int RECV_PIN = 7;
- IRrecv irrecv(RECV_PIN);
- decode_results results;
-
- void setup(){
- Serial.begin(9600);
- irrecv.enableIRIn();
- irrecv.blink13(true);
- }
-
- void loop(){
- if (irrecv.decode(&results)){
- Serial.println(results.value, HEX);
- irrecv.resume();
- }
- }
复制代码
我只用了上箭头,左箭头,右箭头,和中键停止几个按钮。因此通过运行上述代码,在COM里看到了码值如下。 上--511DBB 左--52A3D41F 右--20FE4DBB 中--D7E84B1B
这几个码值被我用到了主程序里。作为控制电机工作的关键值。
第七部:连线图 第八部:代码部分的设计 - //coding is done by gada888 from Luoyang
- #include "IRremote.h"
-
- int input_pin = 7;
- IRrecv irrecv(input_pin);
- decode_results signals;
-
- int Chan_1_etat=1;
- int Chan_2_etat=1;
-
- const int Chan_1 = 2;
- const int Chan_2 = 3;
-
- #define goUp 0x511DBB
- //#define goDown 0xA3C8EDDB
- #define goLeft 0x52A3D41F
- #define goRight 0x20FE4DBB
- #define DoStop 0xD7E84B1B
-
- void setup()
- {
- Serial.begin(9600);
- irrecv.enableIRIn();
-
- pinMode(Chan_1, OUTPUT);
- pinMode(Chan_2, OUTPUT);
-
- digitalWrite(Chan_1, HIGH);
- digitalWrite(Chan_2, HIGH);
-
- }
-
- void loop() {
-
- if (irrecv.decode(&signals)) {
- Serial.println(signals.decode_type);
- Serial.print(F("received code = 0x"));
- Serial.println(signals.value, HEX); //hex value
- irrecv.blink13(true); //blink leds when code is received
-
- if (signals.value == goUp )
- {
- digitalWrite(Chan_1, LOW);
- digitalWrite(Chan_2, LOW);
- }
-
- if (signals.value == goLeft )
- {
- digitalWrite(Chan_1, HIGH);
- digitalWrite(Chan_2, LOW);
- }
-
- if (signals.value == goRight )
- {
- digitalWrite(Chan_1, LOW);
- digitalWrite(Chan_2, HIGH);
- }
-
- if (signals.value == DoStop) {
- digitalWrite(Chan_1, HIGH);
- digitalWrite(Chan_2, HIGH);
- }
- irrecv.resume();
- delay(100);
- }
- }
复制代码
|