我也来玩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();
}
抢个沙发:D 有电路图吗? 这东东很简单啊,也是坛子里面的几个代码拼起来改的,当时直接做的,飞了很多线,主要是数码管用595控制abcdefg,单片机控制片选,剩端口也只用一个595,数码管不同的型号管脚是不一样的。
你有什么问题直接问我吧,这个电路可以包教包会。 高手······ 这个MK的I2C电调有多的吗??能不能送我一个 这东西容易坏,一个四轴就要四个,我有5个,但是也要备用啊,网上有买的,你可以去买呀. 这个电调可以私信购买地址吗? 淘宝有几家在卖的,不过不便宜要40元左右呢,建议你买成品电调好过,现在一般还是PPM的接收机多吧?
我的电调都在买空PCB自己做的,不是买的成品,你可以搜MK 电调. 楼主你好,我也是用arduino nano 的板子,但是一直装不了驱动,求解 你是什么系统,nano 的驱动理论上什么系统就很好安装的啊. 电调的信号线接单片机那个脚
页:
[1]