极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8719|回复: 5

Arduino 控制 lego 红外电机

[复制链接]
发表于 2013-6-24 15:49:31 | 显示全部楼层 |阅读模式
本帖最后由 Damn_intuition 于 2013-6-24 16:05 编辑

arduino通过控制红外发射头,驱动乐高 红外马达,可以同时驱动 4*2路 。

想不清啥时候写的代码了,后来发现网络上一直没见到有人共享,我就发一下。

注意,因为红外马达的接收端控制器是采用微控的,所以正反转指令发送过去后会一直生效,需要停止需要发送 停止 指令(如1,0,0)。


代码如下:

[pre lang="arduino" line="1" file="LegoIR"]#include <IRremote.h>

int RECV_PIN = 11;
int BUTTON_PIN = 12;

IRsend irsend;

void setup()
{
  Serial.begin(9600);
  pinMode(BUTTON_PIN, INPUT);
}

unsigned int rawCodes[RAWBUF];
int codeLen = 35 ;


void sendCode(int C,int A,int B){
  //低是260 高是560
  for (int i = 0 ;i<35 ;i=i+2) rawCodes=180;
  for (int i = 1 ;i<35 ;i=i+2) rawCodes=260;
  rawCodes[1] = 1000;
  rawCodes[3] = ((abs(A) + abs(B) ==200 || abs(A) + abs(B) ==0) ?560:260);
  rawCodes[7] = ((C == 3 || C == 4)?560:260);
  rawCodes[9] = ((C == 2 || C == 4)?560:260);
  rawCodes[17] = 560;
  rawCodes[19] = ((B==-100)?560:260);
  rawCodes[21] = ((B==100)?560:260);
  rawCodes[23] = ((A==-100)?560:260);
  rawCodes[25] = ((A==100)?560:260);
  //LLLL
  unsigned int L;
  L = rawCodes[3] + rawCodes[11] + rawCodes[19] ;
  rawCodes[27] = (( L==1380 || L==780)?560:260);
  L = rawCodes[5] + rawCodes[13] + rawCodes[21] ;
  rawCodes[29] = (( L==1380 || L==780)?560:260);
  L = rawCodes[7] + rawCodes[15] + rawCodes[23] ;
  rawCodes[31] = (( L==1380 || L==780)?560:260);
  L = rawCodes[9] + rawCodes[17] + rawCodes[25] ;
  rawCodes[33] = (( L==1380 || L==780)?560:260);

  irsend.sendRaw(rawCodes, codeLen, 38);
}

int lastButtonState;
void loop() {
  int buttonState = digitalRead(BUTTON_PIN);
  if (lastButtonState == HIGH && buttonState == LOW) {
    sendCode(1,0,0);
    delay(50);
    sendCode(2,0,0);
    delay(50);
    sendCode(3,0,0);
    delay(50);
    sendCode(4,0,0);
    delay(50);
  }
  if (buttonState) {
    sendCode(4,100,100);//100 正转 -100倒转  //参数格式  通道,电机A,电机B
    delay(100);
  }
  lastButtonState = buttonState;
}


[/code]

需要代码打包,可以到我的CSDN上下载,http://download.csdn.net/detail/toboxo/5641375

回复

使用道具 举报

发表于 2013-6-25 08:19:05 | 显示全部楼层
乐高的红外电机?
是不是指,是不是乐高的红外接收+PF电机?
回复 支持 反对

使用道具 举报

发表于 2013-7-17 17:15:53 | 显示全部楼层
unsigned int rawCodes[RAWBUF]; //这句我看不懂。主要不懂rawCodes[RAWBUF]是神马。
直接导致后面sendCode(int C,int A,int B)函数整段全都看不懂。
我知道我是有些基础知识没掌握。请问楼主我应该看那段资料?方便的话请给个链接,谢谢!
回复 支持 反对

使用道具 举报

发表于 2014-3-12 22:32:04 | 显示全部楼层
上个视频啊!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-14 15:29:47 | 显示全部楼层
宋征宇 发表于 2014-3-12 22:32
上个视频啊!!!

亲,你这是挖坟啊。这是我两年期玩NXT时候写的代码,我自己机器上都没有了 哈哈哈。
自己测试下吧,最重要的一句话就是:
sendCode(4,100,100);//100 正转 -100倒转  //参数格式  通道,电机A,电机B
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-14 15:30:59 | 显示全部楼层
本帖最后由 Damn_intuition 于 2014-3-14 15:32 编辑
simatic_net 发表于 2013-7-17 17:15
unsigned int rawCodes[RAWBUF]; //这句我看不懂。主要不懂rawCodes[RAWBUF]是神马。
直接导致后面sendCod ...


那只是一个数组而已,里面存储着待发送的红外数据高低位持续时间。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 12:29 , Processed in 0.041589 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表