本帖最后由 yoyojacky 于 2016-5-24 18:53 编辑
一直被果汁啊,lee啊,追着要树莓派的入门教程,最近正好在修炼电子内功,从一灯大师开始练起,一个灯,两个灯,然后吐了。。
我实在是不想点灯了。因为点了太多灯,有点儿疲劳了,今天来点个数码管,有人吐槽:这还是灯啊!。。。我只好说,好吧,别吹灯,灯是点不完的,你看看少林寺的那些扫地僧,扫地扫出真功夫,现在想入门电子这个大坑,继续点灯,点出道德与情操的时候,就可以顺利搞定大部分传感器啦!
好吧,我可不学lee大大的吹水帖,我这可是实实在在的干货哦!
首先,我们介绍一下我这次点灯的元器件,这样说是不是很有点儿一本正经授课的意思?其实我今天突然出来点灯是有个缘由的,大家认识我的人呢都知道我大学的专业是动物科学啦,而且是微生物专业的,什么酸马奶的乳酸菌分离提纯啥的,都是日常,大学同学听说我在上海从事计算机和电子相关的工作,看到我微信圈里面各种树莓派乱入,他们觉得我应该能帮他们解决一个小小的问题,就是在用显微镜观察菌群的时候,需要计数的时候就很纠结,老的计数器是机械结构,虽然小巧,但是感觉很low,请原谅他们想要高大上的心情,他们提出,能否用电脑显示计数的过程,可以投影在大屏幕上?同时还能够有个直观的计数器帮助记录计数的总数? 我脑海里就突然有个想法,显示用数码管,最近树莓派很火,就用数码管+树莓派不就ok了?再加上轻触按键,妥妥的。于是在家整理了一下思路,并翻箱倒柜找了找数码管,你问我什么是数码管??
喏,就是这个咯!
哎呀,不是这个,这是是1 digit 的数码管,我用的是这种:
突然觉得绿色好low的感觉。。。
你可以用这个。。。
是不是瞬间回到了灌篮高手的球场???
哈哈
这个是其中显示的元器件,还需要以下的设备:
1. Raspberry Pi 任何系列的开发板一套,注意这里是一套哦,就是你如果用树莓派B型,那就至少要一张SD卡,如果是树莓派B+,那你需要一张TF卡,如果你是用树莓派2,model B,那么也需要TF卡,这几个都需要无线网卡或者网线支持哦,如果是用树莓派3,model B,那么恭喜你,你可以不用买网卡和蓝牙啦!我这里用的就是树莓派3
2. 数码管 x1 : 由于菌群数量很多,所以1位数码管不够,2位不high,3位没见过,4位比较好(实际上我只有一个废弃的4位7段显示的数码管)
3. Easy Multiplexing Board x1,就是传说中的1扩3扩展板,很屌的样子,关键是I/O扩展出来太方便使用了。
4. RTC for Pi x1,就是个RTC时钟模块,主要是我插插拔拔经常断线,而且没有时钟觉得时间不准对文件系统是个很大的坑,时间久了容易破坏系统,比较烦。
5. 杜邦线若干,最好是有双公头,双母头,公母混合头的线。。。多备点儿,不差钱。
6. 按键x2 : 我实在找不到更多了,因为很少玩儿按键。。哈哈
7. 面包板 x1 : 最好用大的面包板,不然你知道的,一旦线多了你就有一种盘丝洞的感觉。。。
以上产品,大家可以某宝搜,或者联系我代购(别找我,价格很贵哦)
好了,到这里分割一下。。。
+++++++++++++++++++++++++++++++++++Hualilidefengexian++++++++++++++++++++++++++++++++++
操作步骤:
1. 下载并烧录最新镜像:
下载地址: www.raspberrypi.org/download
2. 烧录镜像:
我使用的是Mac Pro,所以烧录异常简单,将TF卡插入SD卡套,然后插入电脑,打开一个iterm,然后输入:
- sudo diskutils unmountDisk /dev/disk2 #由于在我计算机上识别的SD卡设备文件名就是 /dev/disk2 ,你们的自己用df -h 看看,误操作导致的一切跟我无关哦。
复制代码
- sudo dd=2016-03-18-raspbian-jessie.img of=/dev/disk2
复制代码
敲回车后,就可以去泡杯咖啡,休息一下下。或者拿起你的万用表,测量一下你的数码管管脚啦。
我这里省略了测量管脚的步骤哈,不会用的百度一下,哦,不,去google一下吧。
3. 接线:
这个步骤是最考验耐心的,需要仔细接驳线缆并且确认接入正确,否则,再整理一遍的话,你会失去信心的,请原谅我线序的混乱。。。
接线如下图所示:
实际上,接线可以参考我这个图表:
先上个数码管原理图:
然后我接线的时候整理了一下:
其中物理接口是树莓派的GPIO接口的物理排序,再给你们一个wiringPi的图,对应一下哈
3. 启动系统并登陆下载wiringPi并编译:
- git clone git://git.drogon.net/wiringPi
复制代码
4. 然后再下载我的写好的代码:
- <div>git clone https://github.com/yoyojacky/RPi-C-CODE.git</div><div>cd RPi-C-CODE/</div><div>gcc -o digitled 4segment-digitalLED-with-button-controling.c -lwiringPi</div><div>sudo ./digitled</div>
复制代码
接着就可以去按键刷数码管了屏幕上显示数码管状态,累计计数。
然后数码管状态还是用视频来解释吧。。
哈哈,非常简单入门的一个教程,希望大家喜欢。
我是骑驴玩儿漂移,一个集爱玩儿和爱折腾于一身的男子。。。
————————————————————————————————————————————————————————————————
你们一定以为就这么完成了吧?
下面是一些额外的介绍
目录中包含这些文件:
源码内容:
- #include <wiringPi.h>
- #include <stdio.h>
-
- /* Define some parameters for GPIO pins */
- #define DIGITAL_A 0
- #define DIGITAL_B 1
- #define DIGITAL_C 2
- #define DIGITAL_D 3
- #define DIGITAL_E 4
- #define DIGITAL_F 5
- #define DIGITAL_G 6
- #define DIGITAL_DP 21
- #define DIGITAL_SEG1 22
- #define DIGITAL_SEG2 23
- #define DIGITAL_SEG3 24
- #define DIGITAL_SEG4 25
- #define BUTTONA 27
- #define BUTTONB 26
-
- int x;
- int i;
-
- const char lednumber[10]=
- {
- 0xfc, //0
- 0x60, //1
- 0xda, //2
- 0xf2, //3
- 0x66, //4
- 0xb6, //5
- 0xbe, //6
- 0xe0, //7
- 0xfe, //8
- 0xf6 //9
- };
-
- void init_digitalled(void)
- {
- digitalWrite(DIGITAL_A,LOW);
- digitalWrite(DIGITAL_B,LOW);
- digitalWrite(DIGITAL_C,LOW);
- digitalWrite(DIGITAL_D,LOW);
- digitalWrite(DIGITAL_E,LOW);
- digitalWrite(DIGITAL_F,LOW);
- digitalWrite(DIGITAL_G,LOW);
- digitalWrite(DIGITAL_DP,LOW);
- digitalWrite(DIGITAL_SEG1,HIGH);
- digitalWrite(DIGITAL_SEG2,HIGH);
- digitalWrite(DIGITAL_SEG3,HIGH);
- digitalWrite(DIGITAL_SEG4,HIGH);
- }
-
- void light_led(int x)
- {
- digitalWrite(DIGITAL_A, (lednumber[x] & 0x80));
- digitalWrite(DIGITAL_B, (lednumber[x] & 0x40));
- digitalWrite(DIGITAL_C, (lednumber[x] & 0x20));
- digitalWrite(DIGITAL_D, (lednumber[x] & 0x10));
- digitalWrite(DIGITAL_E, (lednumber[x] & 0x08));
- digitalWrite(DIGITAL_F, (lednumber[x] & 0x04));
- digitalWrite(DIGITAL_G, (lednumber[x] & 0x02));
- digitalWrite(DIGITAL_DP, (lednumber[x] & 0x01));
- }
-
- void display_led(int num)
- {
- int number = num;
- int led1 = 0;
- int led2 = 0;
- int led3 = 0;
- int led4 = 0;
-
- led4 = number%10;
- led3 = number/10%10;
- led2 = number/100%10;
- led1 = number/1000%10;
-
- light_led(led1);
- digitalWrite(DIGITAL_SEG1,LOW);
- delay(1);
- digitalWrite(DIGITAL_SEG1,HIGH);
-
- light_led(led2);
- digitalWrite(DIGITAL_SEG2,LOW);
- delay(1);
- digitalWrite(DIGITAL_SEG2,HIGH);
-
- light_led(led3);
- digitalWrite(DIGITAL_SEG3,LOW);
- delay(1);
- digitalWrite(DIGITAL_SEG3,HIGH);
-
- light_led(led4);
- digitalWrite(DIGITAL_SEG4,LOW);
- delay(1);
- digitalWrite(DIGITAL_SEG4,HIGH);
- }
-
- void init_all(void)
- {
- wiringPiSetup();
- pinMode(DIGITAL_A,OUTPUT);
- pinMode(DIGITAL_B,OUTPUT);
- pinMode(DIGITAL_C,OUTPUT);
- pinMode(DIGITAL_D,OUTPUT);
- pinMode(DIGITAL_E,OUTPUT);
- pinMode(DIGITAL_F,OUTPUT);
- pinMode(DIGITAL_G,OUTPUT);
- pinMode(DIGITAL_DP,OUTPUT);
- pinMode(DIGITAL_SEG1,OUTPUT);
- pinMode(DIGITAL_SEG2,OUTPUT);
- pinMode(DIGITAL_SEG3,OUTPUT);
- pinMode(DIGITAL_SEG4,OUTPUT);
- pinMode(BUTTONA,INPUT);
- pinMode(BUTTONB,INPUT);
- }
-
- int main()
- {
- init_all();
- init_digitalled();
- for(;;)
- {
- display_led(i);
- if(digitalRead(BUTTONA) == 0 || digitalRead(BUTTONB) == 0)
- {
- for(x=0;x<=20;x++)
- {
- display_led(i);
- };
-
- if(digitalRead(BUTTONA) == 0)
- {
- printf("BottonA is pressed! and you press %d times\n", i++);
- };
-
- if(digitalRead(BUTTONB) == 0)
- {
- if (i>0)
- {
- printf("ButtonB was pressed, and you have been pressed %d times\n", i--);
- };
- };
- };
- };
- }
-
复制代码
元器件全部来自:老邓的52Pi.taobao.com哦,别说我打广告哈!
|