返回列表 发新帖我要提问本帖赏金: 10.00元(功能说明)

[活动] 基于KL27的旋转LED

[复制链接]
 楼主| EDL陆 发表于 2016-2-1 19:58 | 显示全部楼层 |阅读模式
本帖最后由 EDL陆 于 2016-2-1 20:06 编辑

  首先自己重新设计了PCB,参考网络上多数人使用无线供电的方式,利用变压器原理,给板上芯片供电,但是在加上无线模块之后,压降太厉害,导致芯片不能正常工作,身边也没有对此比较熟悉的人,教训就是不要再自己不熟悉的地方浪费时间,最终决定换一种方案试一下。如图



反面:中间有两个同心圆,一个接电源,一个接地。电源有马达的轴来供给,为了保证充分接触,选择合适的弹簧套在轴上。为了稍微保持平衡一点,地线也由两个弹簧构成,最好选取软一点的弹簧,不能太硬,不然摩擦会太大。可以想象的到,这样的话旋转起来之后,就不会导致供电有问题了。




正面。排插是留给WIFI模块的,两个595芯片,用来控制16个小灯。

侧视图来一张。


安卓不是很会,现学。在源码的基础上加了自己取字模的功能,更换显示信息。将字模有手机端发送到旋转LED然后存放到Flash,保证数据在掉电后不丢失。接下来试着解决杂声和抖动,完善丰富其他功能。

效果图。

安卓端部分代码:
  1. public class MainActivity<Params> extends TabActivity implements
  2.                 OnClickListener {        
  3.         InputStream fin3;
  4.         int numChinese=0;
  5.         int numAscii=0;
  6.         int offChi;
  7.         int i,j,k,l;
  8.         byte[] temp4 = new byte[32];
  9.         int[] temp5 = new int[32];
  10.         
  11.         int[] temp6 = new int[32];   //最终想要的字模(纵向取模) 同笔记
  12.                
  13.         int[] hanzi =new int[32*4];  //首先声明4个汉字的空间
  14. //        char[] hanzi =new char[32*4];  //首先声明4个汉字的空间
  15.         
  16.         byte[] hanBuf2;
  17.         byte[] hanBuf21;
  18.       

  19.         /******************************************************************************/

  20.         @Override
  21.         public void onClick(View v) {

  22.                 switch (v.getId()) {

  23.                 // 启动2个工作线程:发送、接收。!!!??
  24.                 case R.id.id_btn_connClose:

  25.                         connectThread();
  26.                         break;

  27.                 case R.id.id_btn_send:

  28.                         sendData();
  29.                         break;
  30.                         
  31.                 case R.id.id_btn_clear:

  32.                         clearData();
  33.                         break;
  34.                 }
  35.         }



  36.                 private void sendData() {
  37.                         String contentSend = edtSend.getText().toString(); //取得输入框字符
  38.                         int lenthSend = edtSend.getText().length();        //得到输入字符长度
  39.                         if (printWriter == null || contentSend == null) {

  40.                                 if (printWriter == null) {
  41.                                         showInfo("连接失败!");
  42.                                         return;
  43.                                 }
  44.                                 if (contentSend == null) {
  45.                                         showInfo("内容为空!");
  46.                                         return;
  47.                                 }
  48.                         }        
  49.                         for(i=0;i<lenthSend;i++)  //遍历左右字符
  50.                         {
  51.                                 char ch=contentSend.charAt(i);
  52.                                 String str=String.valueOf(ch);
  53.                                 try {
  54.                                         byte[] bs = str.getBytes("gb2312");   //得到区位码
  55.                                         if(bs.length<2)    //是英文或者符号
  56.                                         {
  57.                                                 numAscii++;
  58.                                                 fin3 = getResources().openRawResource(R.raw.ascii);
  59.                                                 fin3.skip((bs[0]-32)*16);
  60.                                                 fin3.read(temp4, 0, 16);
  61.                                                 //64, 32, -96, -96, -96, -64, 0, 0, 6, 9, 8, 8, 8, 15, 8, 0
  62.                                                 for(j=0;j<16;j++)
  63.                                                 {
  64.                                                         temp5[j]=temp4[j]&0xFF;   //8位无符号
  65.                                                 }
  66.                                                 
  67.                                                 for(k=0;k<8;k++)
  68.                                                 {
  69.                                                         hanzi[k*2]=temp5[k];
  70.                                                         hanzi[k*2+1]=temp5[k+8];
  71.                                                 }

  72.                                                  printWriter.print('A');
  73.                                                 printWriter.print((char)(16*3+1));
  74.                                 printWriter.print((char)i); //帧号
  75.                                 for(l=0;l<16;l++)
  76.                                 {
  77.                                         int baiwei=hanzi[l]/100;
  78.                                         printWriter.print(baiwei);
  79.                                        
  80.                                         int shiwei=(hanzi[l]%100)/10;
  81.                                         printWriter.print(shiwei);
  82.                                        
  83.                                         int gewei=hanzi[l]%10;
  84.                                         printWriter.print(gewei);  
  85.                                 }
  86.                                 printWriter.print('B');        
  87.                                                 printWriter.flush();
  88.                                 Thread.currentThread();
  89.                                                 Thread.sleep(1000);//阻断1秒
  90.                                         }
  91.                                         else
  92.                                         {
  93.                                                 numChinese++;
  94.                                                 int quma=bs[0]&0xff;
  95.                                                 int weima=bs[1]&0xff;
  96.                                                 offChi = ((quma-176)*94+(weima-161))*32;
  97.                                                 fin3 = getResources().openRawResource(R.raw.hzkst2);                                 
  98.                                                 fin3.skip(offChi);
  99.                                                 fin3.read(temp4, 0, 32);
  100.                                                 
  101.                                                 for(j=0;j<32;j++)
  102.                                                 {
  103.                                                         temp5[j]=temp4[j]&0xFF;   //8位无符号
  104.                                                 }
  105.                                                 
  106.                                                 for(k=0;k<16;k++)
  107.                                                 {
  108.                                                         hanzi[k*2]=temp5[k];
  109.                                                         hanzi[k*2+1]=temp5[k+16];   //最终字模
  110.                                                 }
  111.                                                 printWriter.print('A');
  112.                                                 printWriter.print((char)(32*3+1));
  113.                                 printWriter.print((char)i); //帧号
  114.                                 for(l=0;l<32;l++)
  115.                                 {
  116.                                         int baiwei=hanzi[l]/100;
  117.                                         printWriter.print(baiwei);
  118.                                        
  119.                                         int shiwei=(hanzi[l]%100)/10;
  120.                                         printWriter.print(shiwei);
  121.                                        
  122.                                         int gewei=hanzi[l]%10;
  123.                                         printWriter.print(gewei);  
  124.                                 }
  125.                                 printWriter.print('B');        
  126.                                 printWriter.flush();
  127.                                 Thread.currentThread();
  128.                                                 Thread.sleep(1000);//阻断1秒
  129.                                         }
  130.                                        
  131.                                 } catch (Exception e) {
  132.                                         showInfo("字模读取有问题!");
  133.                                         // TODO: handle exception
  134.                                 }
  135.                         }
  136.                         //作为结束帧
  137.                         printWriter.print('A');
  138.                         printWriter.print((char)(1));
  139.                         printWriter.print((char)(numChinese*2+numAscii));
  140.                         printWriter.print('B');
  141.                         printWriter.flush();
  142.                         
  143.                         numChinese=0;
  144.                         numAscii=0;
  145.                                 
  146.                 }

  147.                 private void clearData() {
  148.                         edtReceiver.setText("");
  149.                         
  150.                         showInfo("清除成功!");
  151.                 }

  152.                 private void showInfo(String msg) {

  153.                         Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG ).show();

  154.                 }        

  155. }
取字模相关的主要是sendData函数。
底层部分代码:
  1. #include "includes.h"   //包含总头文件
  2. #include "string.h"
  3. uint_8 receiveFlag=0;
  4. uint_8 startFlag;
  5. uint_8 moveFlag;

  6. #define LED_CLK  GPIO_MAKE_PIN(GPIOC_IDX,3)     //时钟线
  7. #define LED_STB  GPIO_MAKE_PIN(GPIOC_IDX,2)     //数据锁存线
  8. #define LED_OE   GPIO_MAKE_PIN(GPIOC_IDX,1)     //使能线
  9. #define LED_R    GPIO_MAKE_PIN(GPIOC_IDX,0)     //四根红色数据线

  10. uint_8 bittonum(uint_8 a,uint_8 b,uint_8 c)
  11. {
  12.         return a*100+b*10+c;
  13. }



  14. void time_delay(uint_32 delay)
  15. {
  16.     uint_32 k;
  17.     for(k=0;k<delay;k++)
  18.     {

  19.     }
  20. }
  21. void LED_init()
  22. {
  23.         //LED接线初始化:全部定义为输出,同时给出初始电平
  24.         gpio_init(LED_CLK, GPIO_OUTPUT,0);    //时钟线
  25.         gpio_init(LED_STB, GPIO_OUTPUT,0);    //数据锁存线
  26.         gpio_init(LED_OE, GPIO_OUTPUT,1);     //使能线
  27.         gpio_init(LED_R, GPIO_OUTPUT,1);     //数据线
  28. }

  29. void Write595(uint_8 data_byte)
  30. {
  31.         uint_8 l,temp;
  32.         temp=0x80;
  33.         for (l=0;l<8;l++)
  34.         {
  35.         //取data_byte字节中的一位,从高位开始,送入595(数据上线)
  36.             if ((data_byte&temp)==0)
  37.                     gpio_set(LED_R,1);   //灭 ,即0表示灭
  38.             else
  39.             gpio_set(LED_R,0);   //亮,即1表示亮

  40.             //CLK产生上升沿,使数据送到595移位寄存器
  41.         gpio_set(LED_CLK,0);
  42.         gpio_set(LED_CLK,1);

  43.                 temp=temp>>1;
  44.         }
  45. }
  46. int main(void)
  47. {

  48.         uint_8 params[8]={0};
  49.     uint_8 ceshizimo[1024];
  50.         uint_8 zimo[32];
  51.         uint_32 offset;
  52.         uint_8 byteNum;  //1byteNum=16字节
  53.         //1. 声明主函数使用的变量
  54.         uint_32 i,j,k;
  55.         uint_8 numChinese;       //表示接收到汉字的个数,定位flash存储的位置
  56.         uint_8 numAscii;
  57.         uint_32  mRuncount;     //主循环计数器
  58.         uint_32 period;
  59.         uint_8 duty;
  60.         //2. 关总中断
  61.         DISABLE_INTERRUPTS;
  62.         //3. 初始化外设模块
  63.         light_init(RUN_LIGHT_RED,LIGHT_OFF);     //初始化蓝灯
  64.         light_init(RUN_LIGHT_GREEN,LIGHT_OFF);     //初始化蓝灯
  65.         uart_init(0, 115200);
  66.         uart_init(2, 115200);
  67.         flash_init();
  68.         pit_init(0,1000000);
  69.         enable_pit_int();
  70. //        flash_erase(63);
  71.         LED_init();
  72.         gpio_init(INF_LIGHT, 0, 0);
  73. //        uint_8 value=gpio_get(INF_LIGHT);
  74.         gpio_enable_int(INF_LIGHT,FALLING_EDGE);

  75.         flash_read(62,0,2,¶ms[0]);

  76.         if(params[0]==0x0A)
  77.                 byteNum=params[1];
  78.         else
  79.                 byteNum=8;
  80.         numChinese=0;
  81.         numAscii=0;
  82.         moveFlag=0;
  83.         k=0;
  84.         startFlag=0;
  85.         mRuncount=0;            //主循环计数器
  86.         uart_send_string(0,"TEST0");
  87.         uart_send_string(2,"TEST2");
  88.         //5. 使能模块中断
  89.         uart_enable_re_int(0);
  90.         uart_enable_re_int(2);
  91.         //6. 开总中断
  92.         ENABLE_INTERRUPTS;

  93.         //进入主循环
  94.         //主循环开始==================================================================
  95.         for(;;)
  96.         {

  97.             //运行指示灯闪烁-----------------------------------------------
  98.             mRuncount++;                           //主循环次数计数器+1
  99.             if (mRuncount >= RUN_COUNTER_MAX)  //主循环次数计数器大于设定的宏常数
  100.             {
  101.                         mRuncount=0;                   //主循环次数计数器清零
  102.                         light_change(RUN_LIGHT_GREEN);      //蓝灯(RUN_LIGHT_BLUE)状态变化
  103.                     uart_send1(0,'a');
  104.             }

  105.             if(1 == receiveFlag)
  106.             {
  107.                     //字母或数字
  108.                     if(uart_recvBuf[1]==49 )
  109.                     {
  110.                             //如果是首帧,清flash及相关变量
  111.                             if(uart_recvBuf[2]==0)
  112.                             {
  113.                                 numChinese=0;
  114.                                 numAscii=0;
  115.                                 flash_erase(63);
  116.                             }
  117.                             for(i=3,j=0;i<51;i=i+3,j++)
  118.                             {
  119.                         zimo[j]=bittonum(uart_recvBuf[i]-48,uart_recvBuf[i+1]-48,uart_recvBuf[i+2]-48);
  120.                             }

  121.                             offset=numChinese*32+numAscii*16;
  122.                     flash_write(63,offset,16,zimo);   //将字模数据存放到Flash
  123.                         numAscii++;
  124.                             uart_send1(0,'Z');

  125.                     }
  126.                     //是中文汉字
  127.                     else if(uart_recvBuf[1]==97 )
  128.                     {
  129.                             if(uart_recvBuf[2]==0)
  130.                             {
  131.                                 numChinese=0;
  132.                                 numAscii=0;
  133.                                 flash_erase(63);
  134.                             }
  135.                             for(i=3,j=0;i<99;i=i+3,j++)
  136.                             {
  137.                         zimo[j]=bittonum(uart_recvBuf[i]-48,uart_recvBuf[i+1]-48,uart_recvBuf[i+2]-48);
  138.                             }

  139.                             offset=numChinese*32+numAscii*16;
  140.                     flash_write(63,offset,32,zimo);   //将字模数据存放到Flash
  141.                             numChinese++;
  142.                             uart_send1(0,'H');
  143.                     }
  144.                     //结束帧
  145.                     else
  146.                     {
  147.                             flash_erase(62);
  148.                             byteNum=uart_recvBuf[2];
  149.                             params[0]=0x0A;
  150.                             params[1]=byteNum;
  151.                             flash_write(62,0,2,params);   //将字模数据存放到Flash
  152.                             memcpy(ceshizimo,63*1024,byteNum*16);
  153.                             uart_send1(0,'W');
  154.                     }
  155.                     receiveFlag=0;
  156.             }
  157.            //以下加入用户程序----------------------------------------------
  158.             if(moveFlag==1)  //旋转移动
  159.             {
  160.                     k=k+2;
  161.             }

  162.         for(i=k;i<128*2+k;i=i+2)
  163.             {
  164.                 //先发送的是下半部分,再发上半部分
  165.                 Write595(ceshizimo[i+1]);   //下半部分
  166.                 Write595(ceshizimo[i]);   //上半部分   低位在上

  167.                         gpio_set(LED_STB,0);
  168.                         gpio_set(LED_STB,1);

  169.                         gpio_set(LED_OE, 0);//使能

  170.                         time_delay(100);

  171.                         Write595(0x00);
  172.                         Write595(0x00);
  173.                         gpio_set(LED_STB,0);
  174.                         gpio_set(LED_STB,1);
  175.                         gpio_set(LED_OE, 1);//使能
  176.                         if(startFlag==1)
  177.                         {
  178.                                 startFlag=0;
  179.                                 break;
  180.                         }
  181.            }
  182.         }  //主循环end_for
  183.        //主循环结束==========================================================
  184. }


等自己完善好程序在与大家分享。
校园一角,预祝新年快乐!!!




本帖子中包含更多资源

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

×

打赏榜单

21ic小管家 打赏了 10.00 元 2016-05-16
理由:【申请有奖】TI USBType-C来袭,测评达人是你吗?活动打赏。

雪花梨电子 发表于 2017-2-26 20:49 | 显示全部楼层
我是沙发吗?哈哈,祝贺,看着很棒嘛 , 可不可以发我一套耍耍啊。。
 楼主| EDL陆 发表于 2017-3-6 19:19 | 显示全部楼层
雪花梨电子 发表于 2017-2-26 20:49
我是沙发吗?哈哈,祝贺,看着很棒嘛 , 可不可以发我一套耍耍啊。。

已经交给发包方啦。手上没有了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

11

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部