bigmango 发表于 2013-4-17 15:24:32

我也来玩Arduino - 驱动I2C电调

之前做MK的时候有一些多余的电调,由于市面上大部分都是PPM的电调,也有人做过PPM电调的调试工具,
今天我就弄一个I2C的吧,原理是相当的简单啊.

1. Arduino Nano
2. 74HC595,由于端口不够用,所以用了这个来驱动数码管
3. 4位共阴的数码管,加了100欧的限流电阻,感觉不太亮
4. 5角的旋转编码器,不喜欢按键的感觉,编码器调整东西比按键舒服多了.

支持从0-255发送数据到I2C电调,使用的是硬盘电机马达,大概在10左右就可以启动马达了.


静止的时候的全貌



加速到51


全马力255干活

代码很乱,不用细看了,呵呵.



#include "Wire.h"//声明I2C库文件

#include <stdio.h>
#include <string.h>

//74HC595 数码管的A-G
int latchPin = 9; //ST_CP
int clockPin = 8; //SH_CP
int dataPin = 10;

//数字,d1,d2,d3,d4
int d1 = 4;
int d2 = 5;
int d3 = 6;
int d4 = 7;

//编码器
#define PinA 2   //方向一接Pin2脚(中断脚)
#define PinB 3//方向二接Pin3脚(中断脚)
#define PinC 13//按钮接Pin4脚(本例中用于计数清零)
unsigned long time = 0; //2次外部中断时间计时
unsigned long i2cSendTime = 0; //2次外部中断时间计时


#define BLAddrdss 41

byte i2cValue = 0;
byte oldI2cValue = 0;

byte arrNumber={ 0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f};

int count;

void setup()
{
        pinMode(d1, OUTPUT);
        pinMode(d2, OUTPUT);
        pinMode(d3, OUTPUT);
        pinMode(d4, OUTPUT);
        pinMode(latchPin, OUTPUT);
        pinMode(clockPin, OUTPUT);
        pinMode(dataPin, OUTPUT);

       pinMode(PinA,INPUT);
       pinMode(PinB,INPUT);
       pinMode(PinC,INPUT);
   
       Serial.begin(9600);

      Wire.begin(); // 加入 i2c 总线,作为主机

      attachInterrupt(0, blinkB, LOW); //中断脚低电平中断
      attachInterrupt(1, blinkA, LOW); //中断脚低电平中断
      
      time = millis();
      i2cSendTime = millis();

//        digitalWrite(d1, 1);
//        digitalWrite(d2, 0);
//        digitalWrite(d3, 1);
//      digitalWrite(d4, 1);
}

void loop()
{

DisplayNum(i2cValue);

      if (oldI2cValue != i2cValue)
{
      oldI2cValue = i2cValue;
      Serial.print("i2c:");
      Serial.print(i2cValue,DEC);
      Serial.print("\n");
}

if (millis() - i2cSendTime > 20)
{
    Wire.beginTransmission(BLAddrdss); //发送数据到设备号为4的从机
    Wire.write(i2cValue);            // 发送变量x中的一个字节
    Wire.endTransmission();    // 停止发送
    i2cSendTime=millis();
};

}


void dig(int x) //dig(x),开启d(x)端口
{
        digitalWrite(d1, 1);
        digitalWrite(d2, 1);
        digitalWrite(d3, 1);
      digitalWrite(d4, 1);

        switch(x)
        {
                case 1:
                        digitalWrite(d1, 0);
                        break;
                case 2:
                        digitalWrite(d2, 0);
                        break;
                case 3:
                        digitalWrite(d3, 0);
                        break;
                default:
                        digitalWrite(d4, 0);
                        break;
        }

}

void DisplayNum(int num)
{
        int temp = 0;

        if (num >= 1000)
        {
                DisplayFour(num);
        }
        else if (num >= 100)
        {
                DisplayThree(num);
        }
        else if (num >= 10)
        {
                DisplayTwo(num);
        }
        else
        {
                DisplayOne(num);
        }
}

void DisplayFour(int num)
{
        int temp =num / 1000;
        cls();
        dig(1);
        DisplayOne(temp);

        temp =num % 1000;
        DisplayThree(temp);
}

void DisplayThree(int num)
{
        int temp =num / 100;
        cls();
        dig(2);
        DisplayOne(temp);

        temp =num % 100;
        DisplayTwo(temp);
}

void DisplayTwo(int num)
{
        int        temp =num / 10;
        cls();
        dig(3);
        DisplayOne(temp);
        temp = num & temp;
        cls();
      dig(4);
        DisplayOne(temp);
}


void DisplayOne(int num)
{
        digitalWrite(latchPin,0);
        shiftOut(dataPin,clockPin,MSBFIRST,arrNumber);
        digitalWrite(latchPin,1);
      delay(2);
}


void num2(byte num)
{
digitalWrite(latchPin,0);
shiftOut(dataPin,clockPin,MSBFIRST,arrNumber);
digitalWrite(latchPin,1);
delay(2);
}

void num(int x) //num(x),显示数字x
{

switch(x)
{
        default: //0
                digitalWrite(latchPin,0);
                shiftOut(dataPin,clockPin,MSBFIRST,0x3F);
                digitalWrite(latchPin,1);
                break;
        case 1: //1
                digitalWrite(latchPin,0);
                shiftOut(dataPin,clockPin,MSBFIRST,0x6);
                digitalWrite(latchPin,1);
                break;
        case 2: //2
                digitalWrite(latchPin,0);
                shiftOut(dataPin,clockPin,MSBFIRST,0x5b);
                digitalWrite(latchPin,1);
                break;
        case 3: //3
                digitalWrite(latchPin,0);
                shiftOut(dataPin,clockPin,MSBFIRST,0x4f);
                digitalWrite(latchPin,1);
                break;
        case 4: //4
                digitalWrite(latchPin,0);
                shiftOut(dataPin,clockPin,MSBFIRST,0x66);
                digitalWrite(latchPin,1);
                break;
        case 5: //5
                digitalWrite(latchPin,0);
                shiftOut(dataPin,clockPin,MSBFIRST,0x6d);
                digitalWrite(latchPin,1);
                break;
        case 6: //6
                digitalWrite(latchPin,0);
                shiftOut(dataPin,clockPin,MSBFIRST,0x7d);
                digitalWrite(latchPin,1);
                break;
        case 7: //7
                digitalWrite(latchPin,0);
                shiftOut(dataPin,clockPin,MSBFIRST,0x7);
                digitalWrite(latchPin,1);
                break;
        case 8: //8
                digitalWrite(latchPin,0);
                shiftOut(dataPin,clockPin,MSBFIRST,0x7F);
                digitalWrite(latchPin,1);
                break;
        case 9: //9
                digitalWrite(latchPin,0);
                shiftOut(dataPin,clockPin,MSBFIRST,0x6f);
                digitalWrite(latchPin,1);
                break;
        }
delay(5);
}

void cls() //清屏
{
        digitalWrite(latchPin,LOW);
        shiftOut(dataPin,clockPin,MSBFIRST,255);
        digitalWrite(latchPin,HIGH);
}


void blinkA()
{
if ((millis() - time) > 3)
{
    if (i2cValue <255)
    {
      i2cValue ++; //当2次中断之间的时间大于3ms时,计一次有效计数
    }
}
time = millis();
}

void blinkB()
{
if ((millis() - time) > 3)
{
    if (i2cValue > 0)
    {
      i2cValue --;
    }
}
time = millis();
}

温暖冰岩 发表于 2013-4-17 17:09:03

抢个沙发:D

wing 发表于 2013-4-17 23:17:50

有电路图吗?

bigmango 发表于 2013-4-18 07:43:32

这东东很简单啊,也是坛子里面的几个代码拼起来改的,当时直接做的,飞了很多线,主要是数码管用595控制abcdefg,单片机控制片选,剩端口也只用一个595,数码管不同的型号管脚是不一样的。
你有什么问题直接问我吧,这个电路可以包教包会。

天天向上/tp 发表于 2013-4-18 13:51:54

高手······

天天向上/tp 发表于 2013-4-18 20:06:14

这个MK的I2C电调有多的吗??能不能送我一个

bigmango 发表于 2013-4-18 20:20:37

这东西容易坏,一个四轴就要四个,我有5个,但是也要备用啊,网上有买的,你可以去买呀.

nzkid 发表于 2013-7-15 18:47:01

这个电调可以私信购买地址吗?

bigmango 发表于 2013-7-17 15:13:47

淘宝有几家在卖的,不过不便宜要40元左右呢,建议你买成品电调好过,现在一般还是PPM的接收机多吧?
我的电调都在买空PCB自己做的,不是买的成品,你可以搜MK 电调.

justyrc 发表于 2014-5-20 09:36:55

楼主你好,我也是用arduino nano 的板子,但是一直装不了驱动,求解

bigmango 发表于 2014-5-27 20:57:27

你是什么系统,nano 的驱动理论上什么系统就很好安装的啊.

1339282502 发表于 2016-5-28 21:22:52

电调的信号线接单片机那个脚
页: [1]
查看完整版本: 我也来玩Arduino - 驱动I2C电调