樹莓派輪盤遊戲機設計實現

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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章