正規のオンライン小売業者:
![]() |
![]() |
![]() |
レッスンでは、mcp3008を使用してフォトレジスタ(光センサー)のデータを読み取り、LEDの明るさを制御する方法を示します。
1 * Raspberry Pi
1 * ブレッドボード
1 * 10KΩ抵抗器
1 * フォトレジスタ
1 * LED
ジャンパーワイヤー
1 * T拡張ボード
1 * 40ピンケーブル
ソフトウェアの準備
注意:このレッスンでは、PCのPuTTyを介してラズベリーパイをリモートで制御します。ラズベリーパイの設定方法については、 lesson 1: getting started with raspberry piをご覧ください。
フォトレジスタ は光制御可変抵抗器です。フォトレジスタの抵抗値は光の強度が増すにつれて減少します。
このプロジェクトでは、MCP3008 ADCを使用して、光によって変化するフォトレジスタの電圧値を読み取ります。MCP3008はアナログ電圧値をデジタル信号(バイナリ値)に変換し、それをPiに送信します。次に、PiはPWM入力値を変更して、LEDの明るさを制御します。
回路図:


C言語ユーザーとPython言語ユーザー向けに2種類のコードを提供します。
注意:wiringPiライブラリをインストールしていない場合は、Lesson 3に従ってインストールしてください。
1) 以下のコマンドを入力して、osoyooからサンプルコードをダウンロードしてください。
cd ~
sudo sudo wget http://osoyoo.com/driver/pi3_start_learning_kit_lesson_11/lightsensor.c
注意:
サンプルコードファイルをカスタマイズする場合は、ターミナルで以下のコマンドを入力してnanoエディタを使用してソースコードを編集できます。
sudo nano lightsensor.c
2) コードをコンパイルしてください
gcc -Wall -o lightsensor lightsensor.c -lwiringPi
3) プログラムを実行してください。
A)プログラムを実行する前に、MOSI、MISO、SCLK(B10、B9、B11)の動作モードがALT0(代替機能)であることをターミナルコマンドで確認してください:gpio readall。モードがALTOでない場合は、以下のターミナルコマンドを実行してください。
gpio -g mode 9 alt0
gpio -g mode 10 alt0
gpio -g mode 11 alt0

B) プログラムを実行してください。
sudo ./lightsensor
4) テスト結果
プログラムを実行すると、端末にはまずコードの印刷メッセージが表示され、その後、フォトレジスタADC値(電圧)が表示されます。フォトレジスタが遮られると、LEDの明るさが増加し、遮られなくなると、LEDの明るさが減少します。
サンプルコードと説明コメント
#include < unistd.h >
#include < stdint.h >
#include < string.h >
#include < errno.h >
#include < wiringPi.h >
#include < stdio.h >
#include < stdlib.h >
#include < wiringPiSPI.h >
//pin 1(BCM GPIO 18) is PWM port
#define LEDPIN 1
//binary number 1000 (decimal 8) is analog channel prefix
#define CHAN_CONFIG_SINGLE 8
//About SPI channel, read https://osoyoo.com/ja/?p=7612
//since B8 connect to CS/SHDN pin, we need select SPI Channel to 0
#define SPICHANNEL 0
//our light sensor connect to MCP3008 CH0, we set annanalog channel to 0
#define ANALOGCHANNEL 0
static int myFd ;
void spiSetup (int spiChannel)
{
if ((myFd = wiringPiSPISetup (spiChannel, 10000)) < 0)
{
fprintf (stderr, "Can't open the SPI bus: %s\n", strerror (errno)) ;
exit (EXIT_FAILURE) ;
}
}
int myAnalogRead(int spiChannel,int channelConfig,int analogChannel)
{
if(analogChannel7)
return -1;
unsigned char buffer[3] = {1}; // start bit
buffer[1] = (channelConfig+analogChannel) << 4;
wiringPiSPIDataRW(spiChannel, buffer, 3);
return ( (buffer[1] & 3 ) << 8 ) + buffer[2]; // get last 10 bits
}
void print_info()
{
printf("\n");
printf("|************************************|\n");
printf("| MCP3008 read lightsensor |\n");
printf("| ------------------------- |\n");
printf("| | ADC | | Pi | |\n");
printf("| |-----|-----------|-----| |\n");
printf("| | CS | connect to| CE0 | |\n");
printf("| | Din | connect to| MOSI| |\n");
printf("| | Dout| connect to| MISO| |\n");
printf("| | CLK | connect to| SCLK| |\n");
printf("| | CH0 | connect to| 3.3V| |\n");
printf("| | CH1 | connect to| GND | |\n");
printf("|************************************|\n");
printf("| LED connect to GPIO1 |\n");
printf("| OSOYOO|\n");
printf("|************************************|\n");
printf("\n");
}
int main()
{
int adc;
if(wiringPiSetup()<0)
{
printf("setup wiringPi failed!\n");
printf("please check your setup\n");
exit(1);
}
spiSetup(SPICHANNEL);
pinMode(LEDPIN,PWM_OUTPUT);
print_info();
for(;;)
{
//read voltage value from analog CH0 pin data from SPI channel 0
adc = myAnalogRead(SPICHANNEL,CHAN_CONFIG_SINGLE,ANALOGCHANNEL);
printf("ADC = %d\n",adc);
//adc is a value between 0 to 1023, 1023 means max vref value 3.3V
pwmWrite(LEDPIN,1023-adc);
delay(1000);
}
}
for(;;)
{
adc = myAnalogRead(SPICHANNEL,CHAN_CONFIG_SINGLE,ANALOGCHANNEL);
printf("ADC = %d\n",adc);
//USE pwmWrite function defined in to control LED brightness
pwmWrite(LEDPIN,1023-adc);
delay(1000);
}
Python ユーザーの場合は、次の手順を実行してください。
Python言語を使用してプログラムを作成する場合、通常、Rasbian Jessie OSに付属するGPIOライブラリであるRPi.GPIOを使用します。RPi.GPIOとPythonに関する詳細情報については、here をクリックしてください。
1) 以下のコマンドを入力して、osoyooからサンプルコードをダウンロードしてください。
cd ~
sudo wget http://osoyoo.com/driver/pi3_start_learning_kit_lesson_11/lightsensor.py
注意:
サンプルコードファイルをカスタマイズする場合は、ターミナルで以下のコマンドを入力してnanoエディタを使用してソースコードを編集できます。
sudo nano lightsensor.py
2)以下のコマンドを入力してプログラムを実行してください。
sudo python ./lightsensor.py
3) 実行結果
プログラムを実行すると、端末にはまずコードの印刷メッセージが表示され、その後、光センサーのAD値が表示されます。フォトレジスタを覆うと、LEDの明るさが増加し、フォトレジスタに入射する光の強度が増すと、LEDの明るさが減少します。
Python サンプルコードと解説コメント
import time
import os
import RPi.GPIO as GPIO
# change these as desired - they're the pins connected from the
# SPI port on the ADC to the Cobbler
SPICLK = 11
SPIMISO = 9
SPIMOSI = 10
SPICS = 8
#set BCM_GPIO 18(GPIO1) as LED pin
LEDPIN = 18
analogChannel = 0
#setup function for some setup---custom function
def setup():
global p
GPIO.setwarnings(False)
#set the gpio modes to BCM numbering
GPIO.setmode(GPIO.BCM)
# set up the SPI interface pins
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)
#set all LedPin's mode to output,and initial level to HIGH(3.3V)
GPIO.setup(LEDPIN,GPIO.OUT,initial=GPIO.LOW)
#set LEDPIN as PWM output,and frequency=100Hz
p = GPIO.PWM(LEDPIN,100)
#set p begin with ualue 0
p.start(0)
pass
#print message at the begining ---custom function
def print_message():
print ('|**********************************|')
print ('| MCP3008 read lightsensor |')
print ('| ----------------------------- |')
print ('| | ADC | | Pi | |')
print ('| |-----|-----------|-----| |')
print ('| | CS | connect to| CE0 | |')
print ('| | Din | connect to| MOSI| |')
print ('| | Dout| connect to| MISO| |')
print ('| | CLK | connect to| SCLK| |')
print ('| | CH0 | connect to| 3.3V| |')
print ('| | CH1 | connect to| GND | |')
print ('| ********************************** |')
print (' LED connect to GPIO1')
print ('| OSOYOO|')
print ('|**********************************|\n')
print ('Program is running...')
print ('Please press Ctrl+C to end the program...')
# read SPI data from MCP3008 chip, 8 possible adc's (0 thru 7)
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
if ((adcnum > 7) or (adcnum < 0)):
return -1
GPIO.output(cspin, True)
GPIO.output(clockpin, False) # start clock low
GPIO.output(cspin, False) # bring CS low
commandout = adcnum
commandout |= 0x18 # start bit + single-ended bit
commandout <<= 3 # we only need to send 5 bits here
for i in range(5):
if (commandout & 0x80):
GPIO.output(mosipin, True)
else:
GPIO.output(mosipin, False)
commandout <<= 1
GPIO.output(clockpin, True)
GPIO.output(clockpin, False)
adcout = 0
# read in one empty bit, one null bit and 10 ADC bits
for i in range(12):
GPIO.output(clockpin, True)
GPIO.output(clockpin, False)
adcout <<= 1 if (GPIO.input(misopin)): adcout |= 0x1 GPIO.output(cspin, True) adcout >>= 1 # first bit is 'null' so drop it
return adcout
#main function
def main():
while True:
#print info
print_message()
adc = readadc(analogChannel, SPICLK, SPIMOSI, SPIMISO, SPICS)
print ('LightSensor ADC = %d'%(adc))
adc=(1023-adc)*100/1023
p.ChangeDutyCycle(int(adc))
time.sleep(1)
#define a destroy function for clean up everything after the script finished
def destroy():
#stop p
p.stop()
#turn off led
GPIO.output(LEDPIN,GPIO.LOW)
#release resource
GPIO.cleanup()
#
# if run this script directly ,do:
if __name__ == '__main__':
setup()
try:
main()
#when 'Ctrl+C' is pressed,child program destroy() will be executed.
except KeyboardInterrupt:
destroy()
adc=(1023-adc)*100/1023
p.ChangeDutyCycle(int(adc))
DownLoad Url osoyoo.com