佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 3900|回复: 10

研究与学习帖, arduino + MBI5026 shift register + LED

[复制链接]
发表于 6-10-2013 09:37 PM | 显示全部楼层 |阅读模式
实验目的: 为了学习以及研究 arduino 和 shift register

小弟心血来操,就操 arduio 和一粒 MBI5026 shift register IC ..
来看图片只是基本的 MBI5026 链接...







  1. define SDI 11


  2. [code]#define SDI 11
  3. #define CLK 12
  4. #define LE 8

  5. byte pattern [16][16] = {
  6.   { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0   },
  7.   { 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0   },
  8.   {  0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0  },
  9.   { 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0   },
  10.   { 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0   },
  11.   { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0   },
  12.   { 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0   },
  13.   { 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0   },
  14.   { 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0   },
  15.   { 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0   },
  16.   { 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0   },
  17.   { 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0   },
  18.   { 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0   },
  19.   { 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0   },
  20.   { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0   },
  21.   { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1   },
  22. };

  23. int j;
  24. int i = 1;


  25. void setup(){
  26.   pinMode(SDI,OUTPUT);
  27.   pinMode(CLK,OUTPUT);
  28.   pinMode(LE,OUTPUT);
  29. }

  30. void loop(){
  31.   j = j + i;
  32.   if(j == 16 || j == 0 ){
  33.     i = -i;
  34.   };
  35.   ledOutput(j);
  36.   delay(10);
  37.   
  38. }
  39.   
  40.   
  41.   
  42.   
  43. void ledOutput(int j){
  44.     digitalWrite(LE,LOW);
  45.     for(int a = 0; a < 16; a++){
  46.       digitalWrite(CLK,LOW);
  47.       int b = pattern[j][a];
  48.       if(b == 1){
  49.         digitalWrite(SDI,HIGH);
  50.       }
  51.       else{
  52.         digitalWrite(SDI,LOW);
  53.       }
  54.       digitalWrite(CLK,HIGH);
  55.     }
  56.     digitalWrite(LE,HIGH);

  57. }
复制代码
[/code]
Loading FB Video...



继续研究.... 本帖最后由 angels1026 于 6-10-2013 11:58 PM 编辑

评分

参与人数 1积分 +50 收起 理由
pic + 50 原创内容

查看全部评分

回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 6-10-2013 11:43 PM | 显示全部楼层
想请教一下... 关于   
FrequencyTimer2.h 的

为什么会出现
Error  
uint_8t dost't name a type

我之前的电脑没问题的是从新 install 了 arduino IDE 在新电脑才发现到 FrequencyTimer2.h  不能用
回复

使用道具 举报

发表于 7-10-2013 07:23 PM | 显示全部楼层
angels1026 发表于 6-10-2013 11:43 PM
想请教一下... 关于   
FrequencyTimer2.h 的

FrequencyTimer有放置在libraries文件夹里吗?

你的代码有 #include <FrequencyTimer2.h>吗?

FrequencyTimer library有一个Test example,也是发生同样问题吗?
回复

使用道具 举报

 楼主| 发表于 8-10-2013 10:15 PM | 显示全部楼层
西门庆33 发表于 7-10-2013 07:23 PM
FrequencyTimer有放置在libraries文件夹里吗?

你的代码有 #include 吗?

大哥最近研究个 arduino VU meter ... 研究出了自己的 源码...
  1. #define SDI 11
  2. #define CLK 12
  3. #define LE 8

  4. byte volume [16][16] = {
  5.   { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0   },
  6.   { 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0   },
  7.   { 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0   },
  8.   { 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0   },
  9.   { 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0   },
  10.   { 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0   },
  11.   { 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0   },
  12.   { 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0   },
  13.   { 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0   },
  14.   { 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0   },
  15.   { 1,1,1,1.1,1,1,1,1,1,1,0,0,0,0,0   },
  16.   { 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0   },
  17.   { 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0   },
  18.   { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0   },
  19.   { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0   },
  20.   { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1   },
  21. };

  22. int volumeRead;
  23. int maxVolume = 350;

  24. void setup(){
  25.   pinMode(SDI,OUTPUT);
  26.   pinMode(CLK,OUTPUT);
  27.   pinMode(LE,OUTPUT);
  28.   Serial.begin(9600);
  29. }

  30. void loop(){
  31.   volumeRead = map(analogRead(A1) , 0, maxVolume, 0 , 16);
  32.   ledOutput(volumeRead);
  33. }
  34.   
  35.   
  36.   
  37.   
  38.   
  39. void ledOutput(int volumeRead){
  40.     digitalWrite(LE,LOW);
  41.     for(int a = 0; a < 16; a++){
  42.       digitalWrite(CLK,LOW);
  43.       int b = volume[volumeRead][a];
  44.       if(b == 1){
  45.         digitalWrite(SDI,HIGH);
  46.       }
  47.       else{
  48.         digitalWrite(SDI,LOW);
  49.       }
  50.       digitalWrite(CLK,HIGH);
  51.     }
  52.     digitalWrite(LE,HIGH);

  53. }  
  54.   
  55.   
  56.   
  57.   
  58.   
复制代码
可以动...看了有点爽...
问题是...  有没有的 自动 adjust volume ... 因为我要开大声才会有反应... 虽然可以在 maxVolume 那边做手脚... 可是想要做个 amp VU meter 没有理由吧整个电脑搬上车吧...   做个手动 adjust 好像没有什么 standart ..
还有一个问题... 我接上了这个 VU meter 过后我的 喇叭的声音变得很差... bass 的时候 prok .. 漏风的声音... 静音的时候感觉到吵... 想请问下 老大下有什么办法决绝难题...
回复

使用道具 举报

发表于 8-10-2013 10:50 PM | 显示全部楼层
angels1026 发表于 8-10-2013 10:15 PM
大哥最近研究个 arduino VU meter ... 研究出了自己的 源码...可以动...看了有点爽...
问题是...  有没 ...

使用Op Amp吧。
回复

使用道具 举报

 楼主| 发表于 8-10-2013 11:22 PM | 显示全部楼层
西门庆33 发表于 8-10-2013 10:50 PM
使用Op Amp吧。
  1. #include <FrequencyTimer2.h>
  2. #define SDI  11
  3. #define CLK  12
  4. #define LE  8

  5. byte pattern [16][16] = {
  6.   { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0   },
  7.   { 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0   },
  8.   {  0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0  },
  9.   { 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0   },
  10.   { 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0   },
  11.   { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0   },
  12.   { 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0   },
  13.   { 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0   },
  14.   { 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0   },
  15.   { 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0   },
  16.   { 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0   },
  17.   { 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0   },
  18.   { 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0   },
  19.   { 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0   },
  20.   { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0   },
  21.   { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1   },
  22. };

  23. int i;
  24. int j;

  25. void setup(){
  26.   pinMode(SDI,OUTPUT);
  27.   pinMode(CLK,OUTPUT);
  28.   pinMode(LE,OUTPUT);
  29.   Serial.begin(9600);
  30.   
  31.   FrequencyTimer2::setPeriod(2000);
  32.   
  33.   FrequencyTimer2::disable();

  34.   FrequencyTimer2::setOnOverflow(shiftOut);
  35. }


  36. void loop(){
  37.   j++;
  38.   if(j ==16){
  39.     j = 0;
  40.   };
  41.   delay(100);
  42. }



  43. void shiftOut(){
  44.   digitalWrite(LE,LOW);
  45.   for(i = 0; i < 16; i++){
  46.     if(pattern[j][i] == 1){
  47.       digitalWrite(SDI,HIGH);
  48.     }
  49.     else{
  50.       digitalWrite(SDI,LOW);
  51.     }
  52.     digitalWrite(CLK,HIGH);
  53.     digitalWrite(CLK,LOW);
  54.   }
  55.   digitalWrite(LE,HIGH);
  56. }
复制代码
frequencytimer 问题原来是在  document 里面的 file 有问题 把它 delete 掉就可以用了... 我做了实验
不够小弟想学习..来个 digitalWrite , 现在想要研究 port manipulation
  ... 想请问大大有什么建议吗 ?  
回复

使用道具 举报

Follow Us
发表于 8-10-2013 11:30 PM | 显示全部楼层
angels1026 发表于 8-10-2013 11:22 PM
frequencytimer 问题原来是在  document 里面的 file 有问题 把它 delete 掉就可以用了... 我做了实验
...

如果想要更快速的IO处理,当然要学习port manipulation


回复

使用道具 举报

 楼主| 发表于 8-10-2013 11:51 PM | 显示全部楼层
西门庆33 发表于 8-10-2013 11:30 PM
如果想要更快速的IO处理,当然要学习port manipulation了

研究了 1 小时  第一个 BLINK  LED pin 13  挑战成功


  1. void setup(){
  2.   DDRB = 0x20;
  3. }

  4. void loop(){
  5.   DDRB ^=  0x20 ;
  6.   delay(100);
  7. }
复制代码
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 9-10-2013 12:49 AM | 显示全部楼层
西门庆33 发表于 8-10-2013 11:30 PM
如果想要更快速的IO处理,当然要学习port manipulation了

  1. byte pattern [16][16] = {
  2.   { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0   },
  3.   { 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0   },
  4.   {  0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0  },
  5.   { 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0   },
  6.   { 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0   },
  7.   { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0   },
  8.   { 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0   },
  9.   { 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0   },
  10.   { 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0   },
  11.   { 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0   },
  12.   { 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0   },
  13.   { 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0   },
  14.   { 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0   },
  15.   { 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0   },
  16.   { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0   },
  17.   { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1   },
  18. };

  19. int i;
  20. int j;

  21. void setup(){  
  22.   DDRB = 0x19;
  23. }


  24. void loop(){
  25.   j++;
  26.   if(j ==16){
  27.     j = 0;
  28.   };
  29.   shiftOut(j);
  30.   delay(30);
  31. }



  32. void shiftOut(int j){
  33.   PORTB ^= 0x01;
  34.   for(i = 0; i < 16; i++){
  35.     if(pattern[j][i] == 1){
  36.       PORTB = 0x08;
  37.     }
  38.     else{
  39.       PORTB | 0x08;
  40.     }
  41.     PORTB  = 0x10;
  42.     PORTB  ^= 0x10;
  43.   }
  44.   PORTB = 0x01;
  45. }
复制代码
是不是这样用的啊 ....
这个源码可以用.. LED 会跑动..
可是小弟不明白   ^  &  |     和当他们加上  = 的时候那些 function 是怎样的啊 ... 小弟请大大指教


回复

使用道具 举报

发表于 9-10-2013 07:09 PM | 显示全部楼层
angels1026 发表于 9-10-2013 12:49 AM
是不是这样用的啊 ....
这个源码可以用.. LED 会跑动..
可是小弟不明白   ^  &  |     和当他们加上  = ...

必须先搞清楚ATmeaga328与Arduino UNO的对照脚
PORTB = Digital 8至Digital 13
Atmega168PinMap2.png


^叫为Exclusive OR(XOR), 用于toggle谋bit
PORTB ^= 0x01 (0001)就是toggle bit0(Digital 8),其余bit不会隨之变动

PORTB | 0x08(1000)用于关闭(LOW)bit3(Digital 11),类似digitalWrite(11, LOW);
PORTB | 0x08不能单独使用,之前必须先运行PORTB = 0x08
PORTB | 0x08运行前,会记录之前的PORTB 输出状态
PORTB | 0x08有如flip flop,当此bit3 LOW时,之前的PORTB 输出会变HIGH

PORTB  = 0x10(0001 0000)
PORTB  ^= 0x10
是用于toggle bit5(Digital 13),可以写成这样
digitalWrite(13, HIGH)
digitalWrite(13, LOW)
回复

使用道具 举报

 楼主| 发表于 11-10-2013 12:17 AM | 显示全部楼层
西门庆33 发表于 8-10-2013 10:50 PM
使用Op Amp吧。

大哥... 我跑去仙家... 不小心 在 Atmel 328 插错了 wire .. 怕   Analog pin  A0 烧坏了... 其他的脚还可以做工...
可是会发热 -.-  有没有药救啊 ? 擦风油可以吗 ? 说笑而已
有点伤心...   明天要偷偷拿去对换...   上载 LED cube 的源码... 然后跑去公司摆美的 LED cube 对换他的 IC ...
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 21-4-2024 12:30 AM , Processed in 0.084031 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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