|
|
之前做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[10]={ 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[num]);
- digitalWrite(latchPin,1);
- delay(2);
- }
- void num2(byte num)
- {
- digitalWrite(latchPin,0);
- shiftOut(dataPin,clockPin,MSBFIRST,arrNumber[num]);
- 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();
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|