极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 31081|回复: 11

我也来玩Arduino - 驱动I2C电调

[复制链接]
发表于 2013-4-17 15:24:32 | 显示全部楼层 |阅读模式
之前做MK的时候有一些多余的电调,由于市面上大部分都是PPM的电调,也有人做过PPM电调的调试工具,
今天我就弄一个I2C的吧,原理是相当的简单啊.

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

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


静止的时候的全貌



加速到51


全马力255干活

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



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

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

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

  8. //数字,d1,d2,d3,d4
  9. int d1 = 4;
  10. int d2 = 5;
  11. int d3 = 6;
  12. int d4 = 7;

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


  19. #define BLAddrdss 41

  20. byte i2cValue = 0;
  21. byte oldI2cValue = 0;

  22. byte arrNumber[10]={ 0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x7,0x7f,0x6f  };

  23. int count;

  24. void setup()
  25. {
  26.         pinMode(d1, OUTPUT);
  27.         pinMode(d2, OUTPUT);
  28.         pinMode(d3, OUTPUT);
  29.         pinMode(d4, OUTPUT);
  30.         pinMode(latchPin, OUTPUT);
  31.         pinMode(clockPin, OUTPUT);
  32.         pinMode(dataPin, OUTPUT);

  33.        pinMode(PinA,INPUT);
  34.        pinMode(PinB,INPUT);
  35.        pinMode(PinC,INPUT);
  36.    
  37.        Serial.begin(9600);

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

  39.       attachInterrupt(0, blinkB, LOW); //中断脚低电平中断
  40.       attachInterrupt(1, blinkA, LOW); //中断脚低电平中断
  41.       
  42.       time = millis();
  43.       i2cSendTime = millis();
  44.   
  45. //        digitalWrite(d1, 1);
  46. //        digitalWrite(d2, 0);
  47. //        digitalWrite(d3, 1);
  48. //        digitalWrite(d4, 1);
  49. }

  50. void loop()
  51. {

  52.   DisplayNum(i2cValue);

  53.       if (oldI2cValue != i2cValue)
  54.   {
  55.       oldI2cValue = i2cValue;
  56.       Serial.print("i2c:");
  57.       Serial.print(i2cValue,DEC);
  58.       Serial.print("\n");
  59.   }
  60.   
  61.   if (millis() - i2cSendTime > 20)
  62.   {
  63.     Wire.beginTransmission(BLAddrdss); //发送数据到设备号为4的从机
  64.     Wire.write(i2cValue);              // 发送变量x中的一个字节  
  65.     Wire.endTransmission();    // 停止发送
  66.     i2cSendTime=millis();
  67.   };

  68. }


  69. void dig(int x) //dig(x),开启d(x)端口
  70. {
  71.         digitalWrite(d1, 1);
  72.         digitalWrite(d2, 1);
  73.         digitalWrite(d3, 1);
  74.         digitalWrite(d4, 1);

  75.         switch(x)
  76.         {
  77.                 case 1:
  78.                         digitalWrite(d1, 0);
  79.                         break;
  80.                 case 2:
  81.                         digitalWrite(d2, 0);
  82.                         break;
  83.                 case 3:
  84.                         digitalWrite(d3, 0);
  85.                         break;
  86.                 default:
  87.                         digitalWrite(d4, 0);
  88.                         break;
  89.         }

  90. }

  91. void DisplayNum(int num)
  92. {
  93.         int temp = 0;

  94.         if (num >= 1000)
  95.         {
  96.                 DisplayFour(num);
  97.         }
  98.         else if (num >= 100)
  99.         {
  100.                 DisplayThree(num);
  101.         }
  102.         else if (num >= 10)
  103.         {
  104.                 DisplayTwo(num);
  105.         }
  106.         else
  107.         {
  108.                 DisplayOne(num);
  109.         }
  110. }

  111. void DisplayFour(int num)
  112. {
  113.         int temp =  num / 1000;
  114.         cls();
  115.         dig(1);
  116.         DisplayOne(temp);

  117.         temp =  num % 1000;
  118.         DisplayThree(temp);
  119. }

  120. void DisplayThree(int num)
  121. {
  122.         int temp =  num / 100;
  123.         cls();
  124.         dig(2);
  125.         DisplayOne(temp);

  126.         temp =  num % 100;
  127.         DisplayTwo(temp);
  128. }

  129. void DisplayTwo(int num)
  130. {
  131.         int        temp =  num / 10;
  132.         cls();
  133.         dig(3);
  134.         DisplayOne(temp);
  135.         temp = num & temp;
  136.         cls();
  137.         dig(4);
  138.         DisplayOne(temp);
  139. }


  140. void DisplayOne(int num)
  141. {
  142.         digitalWrite(latchPin,0);
  143.         shiftOut(dataPin,clockPin,MSBFIRST,arrNumber[num]);
  144.         digitalWrite(latchPin,1);
  145.         delay(2);
  146. }


  147. void num2(byte num)
  148. {
  149.   digitalWrite(latchPin,0);
  150.   shiftOut(dataPin,clockPin,MSBFIRST,arrNumber[num]);
  151.   digitalWrite(latchPin,1);
  152.   delay(2);
  153. }

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

  156. switch(x)
  157. {
  158.         default: //0
  159.                 digitalWrite(latchPin,0);
  160.                 shiftOut(dataPin,clockPin,MSBFIRST,0x3F);
  161.                 digitalWrite(latchPin,1);
  162.                 break;
  163.         case 1: //1
  164.                 digitalWrite(latchPin,0);
  165.                 shiftOut(dataPin,clockPin,MSBFIRST,0x6);
  166.                 digitalWrite(latchPin,1);
  167.                 break;
  168.         case 2: //2
  169.                 digitalWrite(latchPin,0);
  170.                 shiftOut(dataPin,clockPin,MSBFIRST,0x5b);
  171.                 digitalWrite(latchPin,1);
  172.                 break;
  173.         case 3: //3
  174.                 digitalWrite(latchPin,0);
  175.                 shiftOut(dataPin,clockPin,MSBFIRST,0x4f);
  176.                 digitalWrite(latchPin,1);
  177.                 break;
  178.         case 4: //4
  179.                 digitalWrite(latchPin,0);
  180.                 shiftOut(dataPin,clockPin,MSBFIRST,0x66);
  181.                 digitalWrite(latchPin,1);
  182.                 break;
  183.         case 5: //5
  184.                 digitalWrite(latchPin,0);
  185.                 shiftOut(dataPin,clockPin,MSBFIRST,0x6d);
  186.                 digitalWrite(latchPin,1);
  187.                 break;
  188.         case 6: //6
  189.                 digitalWrite(latchPin,0);
  190.                 shiftOut(dataPin,clockPin,MSBFIRST,0x7d);
  191.                 digitalWrite(latchPin,1);
  192.                 break;
  193.         case 7: //7
  194.                 digitalWrite(latchPin,0);
  195.                 shiftOut(dataPin,clockPin,MSBFIRST,0x7);
  196.                 digitalWrite(latchPin,1);
  197.                 break;
  198.         case 8: //8
  199.                 digitalWrite(latchPin,0);
  200.                 shiftOut(dataPin,clockPin,MSBFIRST,0x7F);
  201.                 digitalWrite(latchPin,1);
  202.                 break;
  203.         case 9: //9
  204.                 digitalWrite(latchPin,0);
  205.                 shiftOut(dataPin,clockPin,MSBFIRST,0x6f);
  206.                 digitalWrite(latchPin,1);
  207.                 break;
  208.         }
  209. delay(5);
  210. }

  211. void cls() //清屏
  212. {
  213.         digitalWrite(latchPin,LOW);
  214.         shiftOut(dataPin,clockPin,MSBFIRST,255);
  215.         digitalWrite(latchPin,HIGH);
  216. }


  217. void blinkA()
  218. {
  219.   if ((millis() - time) > 3)
  220.   {
  221.     if (i2cValue <255)
  222.     {
  223.       i2cValue ++; //当2次中断之间的时间大于3ms时,计一次有效计数
  224.     }
  225.   }
  226.   time = millis();
  227. }

  228. void blinkB()
  229. {
  230.   if ((millis() - time) > 3)
  231.   {
  232.     if (i2cValue > 0)
  233.     {
  234.       i2cValue --;
  235.     }
  236.   }
  237.   time = millis();
  238. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-4-17 17:09:03 | 显示全部楼层
抢个沙发
回复 支持 反对

使用道具 举报

发表于 2013-4-17 23:17:50 | 显示全部楼层
有电路图吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-18 07:43:32 | 显示全部楼层
这东东很简单啊,也是坛子里面的几个代码拼起来改的,当时直接做的,飞了很多线,主要是数码管用595控制abcdefg,单片机控制片选,剩端口也只用一个595,数码管不同的型号管脚是不一样的。
你有什么问题直接问我吧,这个电路可以包教包会。
回复 支持 反对

使用道具 举报

发表于 2013-4-18 13:51:54 | 显示全部楼层
高手······
回复 支持 反对

使用道具 举报

发表于 2013-4-18 20:06:14 | 显示全部楼层
这个MK的I2C电调有多的吗??能不能送我一个
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-18 20:20:37 | 显示全部楼层
这东西容易坏,一个四轴就要四个,我有5个,但是也要备用啊,网上有买的,你可以去买呀.
回复 支持 反对

使用道具 举报

发表于 2013-7-15 18:47:01 | 显示全部楼层
这个电调可以私信购买地址吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-17 15:13:47 | 显示全部楼层
淘宝有几家在卖的,不过不便宜要40元左右呢,建议你买成品电调好过,现在一般还是PPM的接收机多吧?
我的电调都在买空PCB自己做的,不是买的成品,你可以搜MK 电调.
回复 支持 反对

使用道具 举报

发表于 2014-5-20 09:36:55 | 显示全部楼层
楼主你好,我也是用arduino nano 的板子,但是一直装不了驱动,求解
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-27 20:57:27 | 显示全部楼层
你是什么系统,nano 的驱动理论上什么系统就很好安装的啊.
回复 支持 反对

使用道具 举报

发表于 2016-5-28 21:22:52 | 显示全部楼层
电调的信号线接单片机那个脚
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 11:10 , Processed in 0.046634 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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