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/