树莓派轮盘游戏机设计实现

made by Rk

本文由浙江大学《嵌入式系统》课程提供强力支持。

感谢翁恺老师 @翁恺BA5AG

===============================================

0、实验要求:

在RPi的Linux上做一个轮盘游戏机,具有两个按钮,一个负责启动,一个负责停止。具有某个或多个输出设备,如 LED、LED矩阵、双位7段数码管、LCD、蜂鸣器、舵机等,可任选其中一个或多个的组合。按下启动按钮,输出设备上 就出现各种变化,如流水灯、递增递减的数字、舵机的旋转等,按下停止按钮,输出设备就固定在当时的状态上。程序 运行的过程,会在shell输出数据。程序必须用C/C++语言写。


1、安装wiringPi

成熟的库如wiringPi可以用来控制树莓派的GPIO接口。

安装过程如下:

进入系统临时文件夹/tmp

输入命令:

git clone git://git.drogon.net/wiringPi



cd wiringPi
sudo ./build

输入以下命令验证wiringPi是否安装成功:

gpio -v
gpio readall



wiringPi的接口映射(来自https://projects.drogon.net/raspberry-pi/wiringpi/pins/):



2、具体连线

使用了Fritzing软件进行布线设计。



七段数码管数值设定:



根据共阴/共阳规则,需要仔细设定七段数码管的数值数组:

char digit[10][8] =  //The increasing number
    {
        {0,0,0,0,0,0,1,1}, //0
        {1,0,0,1,1,1,1,1}, //1
        {0,0,1,0,0,1,0,1}, //2
        {0,0,0,0,1,1,0,1}, //3
        {1,0,0,1,1,0,0,1}, //4
        {0,1,0,0,1,0,0,1}, //5
        {0,1,0,0,0,0,0,1}, //6
        {0,0,0,1,1,1,1,1}, //7
        {0,0,0,0,0,0,0,1}, //8
        {0,0,0,0,1,0,0,1}  //9
    };
char loop[6][8] =   //the loop-running bar in the left windows
    {
        {0,1,1,1,1,1,1,1},
        {1,0,1,1,1,1,1,1},
        {1,1,0,1,1,1,1,1},
        {1,1,1,0,1,1,1,1},
        {1,1,1,1,0,1,1,1},
        {1,1,1,1,1,0,1,1},
    };




3、本实验所需代码

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>

#define DIGIT0 8
#define DIGIT1 9
#define BTN0 10
#define BTN1 11
char digit[10][8] =  //The increasing number
    {
        {0,0,0,0,0,0,1,1}, //0
        {1,0,0,1,1,1,1,1}, //1
        {0,0,1,0,0,1,0,1}, //2
        {0,0,0,0,1,1,0,1}, //3
        {1,0,0,1,1,0,0,1}, //4
        {0,1,0,0,1,0,0,1}, //5
        {0,1,0,0,0,0,0,1}, //6
        {0,0,0,1,1,1,1,1}, //7
        {0,0,0,0,0,0,0,1}, //8
        {0,0,0,0,1,0,0,1}  //9
    };
char loop[6][8] =   //the loop-running bar in the left windows
    {
        {0,1,1,1,1,1,1,1},
        {1,0,1,1,1,1,1,1},
        {1,1,0,1,1,1,1,1},
        {1,1,1,0,1,1,1,1},
        {1,1,1,1,0,1,1,1},
        {1,1,1,1,1,0,1,1},
    };

void main() 
{
    int pin;
    int m = 0, n = 0;
    int flag = 1;
    int run = 0;
    unsigned int time0 = 0, time1 = 0;

    if (wiringPiSetup () == -1) //test the install status of wiringPi
    {
        exit (1) ;
    }

    for (pin = 0 ; pin < 8 ; ++pin) 
    {
        pinMode (pin, OUTPUT) ;
        digitalWrite(pin, HIGH);
    }

    pinMode(DIGIT0, OUTPUT); //The left number
    pinMode(DIGIT1, OUTPUT); //The right number
    pinMode(BTN0, INPUT); //The start button
    pinMode(BTN1, INPUT); //The stop button

    while (true) 
    {
        time1 = millis();

        if (digitalRead(BTN0) && run == 0) 
        {
            puts("Start!");
            run = 1;    //change the running state
            m = 0;
            n = 0;
            time0 = millis();
        }
        else if (digitalRead(BTN1) && run == 1) 
        {
            puts("Stop!");
            run = 0;
        }

        if (time1 - time0 >= 50 && run == 1) 
        {
            time0 = time1;
            printf("%d\n", n);
            m = ++m % 6;
            n = ++n % 10;
        }

        for (pin = 0; pin < 8; pin++) 
        {
            digitalWrite(pin, flag ? digit[n][pin] : loop[m][pin]);
        }

        digitalWrite(DIGIT0, flag);
        digitalWrite(DIGIT1, (flag = 1 - flag));
        delay(10);
    }

}

4、实验结果视频:

审核通过

http://v.youku.com/v_show/id_XNTcxMTI1MTA0.html


5、参考资料:

https://projects.drogon.net/raspberry-pi/wiringpi/pins/

https://projects.drogon.net/raspberry-pi/wiringpi/functions/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值