![見出し画像](https://assets.st-note.com/production/uploads/images/36740059/rectangle_large_type_2_0f59d44b730887f87aebc4a726c6ca60.jpg?width=1200)
TECHBEER エッジ側制御部分組み立て編
ラズパイとブレッドボードをつないでいきます。
電源確保
TECHBEERの発酵コントロールに使う電源の種類は以下の4つです。
とくにコンセントから12V安定化電源に100Vを接続する際は非常に気をつけてください!感電すると火傷、死亡の可能性もあります。
・100V(AC)
・12V(DC)
・5V(DC)
・3.3V(DC)
12V安定化電源の電源配線
モータードライバー、ファンへ12Vを供給するための配線を行います。端子に書かれた+、-のマークを確認して配線してください。
赤丸の部分にAC100Vを供給します。ここは非常に危険です。
感電、ショートに注意、絶縁をしっかりしてください。
感電、火災の原因になります。
※一切の責任はもちませんご自身の判断責任で作業をお願いします。
ファンとペルチェ素子へ12V(DC)の供給
赤丸の方を12V安定化電源につなぎます。オレンジ丸をモータードライバーの出力につなぎます。モータードライバーCytron MD30Cの電源配線の項目の青矢印につなぎます。
モータードライバーCytron MD30Cの電源配線
以下の図の左の矢印部分に12Vを供給します。赤色が+で黒色が-です。
右の青矢印はペルチェ素子につなぎます。モータードライバーが+、-の正転、逆転をします。
ラズパイに5Vの電源供給を行う
赤丸の部分にUSB給電をします。5Vを使う箇所はここだけです。
ラズパイからブレッドボードに3.3Vの電源を供給する
オス-メスジャンパ線を使ってPin番号1番からブレッドボードに3.3vの+を配線します。この図はラズパイのピン配置です。
3.3Vを温度センサ(DS18B20)に電源を供給する
ブレッドボードの3.3Vから電源を供給します。ラズパイのピンの1番は3.3Vの出力なのでブレッドボードの供給先に送ります。
温度センサ(DS18B20)の配線をブレッドボードにさせるようにジャンパピンに変更します。
赤 Vcc
黄 Data
黒 GND
制御線の接続
電源の結線は以上で完了です。ここからは制御の為の結線を進めていきます。配線は以下の通り配線します。以下の配線図を見て組み立ててください。
GPIO4番と温度センサ(DS18B20)との接続
・濃い青丸 温度センサの配線(Vcc Data GND)です。
・2つの緑丸 ラズパイのGNDと温度センサのGND配線です(写真ではラズパイの14番PINに接続しています)。
・2つの水色丸 ラズパイのGPIO4番と温度センサのDataとの配線です。
・オレンジ 4.7KΩ抵抗です。温度センサのDataとVccの間に入れます。
GPIO27番,17番と3V駆動リレー(Y14H-1C-3DS)の接続
リレーの説明を少しさせて頂きます。リレーの2番と5番に3.3Vを流すと1番と3番がつながります。
1. 動作電源
2. 制御電源(ラズパイのGPIO17,27へ)
3. 動作電源
4. 使いません
5. 制御電源(ラズパイのGNDへ)
6. 使いません
例えばリレーの2番とラズパイのGPIO17番をつなぎ、リレーの5番とラズパイのGNDにつなぎ、ラズパイからGPIO17番をONにするとリレーの1番と3番が導通します。
緑丸 GPIO17番と配線
赤丸 リレー2番と配線
青丸 リレー5番とGNDと配線
オレンジ丸 モータードライバーCytron MD30Cと配線
これらをGPIO27番とリレーをもう一つ配線します。
WiringPi
WiringPiはラズパイからGPIOを使う場合に使用します。コンソールからインストールをします。
$ sudo apt --purge remove wiringpi
パッケージの確認
$ dpkg -l | grep wiringpi
ラズパイのマイクロSDにOSをインストールする
CodeAidさんの超簡単Raspberry PiにOSインストールがとっても参考になります。
温度センサ(DS18B20)の動作準備
/boot/config.txtに以下の行を追加。以下のコマンドはviエディタでのconfig.txtを編集するやり方です。エディタはご自由に選択なさってください。sudoを使う必要があります。
sudo vi /boot/config.txt
config.txtに以下の行を追加し保存します。
dtoverlay=w1-gpio,pullup=on
(★これどっちになってるか確認)
dtoverlay=w1-gpio,gpiopin=4,pullup=y
techbeer.c
ラズパイのデスクトップにdevというフォルダを作成し、以下のソースコードをtechbeer.cというファイルにして/home/pi/Desktop/devに保存する。
少しだけコードの補足をするとGPIO17とGPIO27にペルチェをコントロールするためのリレーをつないでおりGPIO17と27でヒーター、クーラ―のコントロールをしてます。
温度センサ(DS18B20)の温度を検出し28度を超えるとクーラーをON、クーラ―が作動し26度以下になるとクーラーをOFFにします。
22度を下回るとヒーターをONします。ヒーターが作動し24度を超えるとヒーターをOFFにします。
//2020.10.05
//Avanade Kanasai
//Yoshihiko Sugimoto
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <sys/time.h>
#include <unistd.h> #include <wiringPi.h>
#define GPIO17 17 #define GPIO27 27
//Peltierコントローラの状態遷移 #define PELTIER_VOID 0 //無効 #define PELTIER_OFF 1 //OFF状態 #define PELTIER_COOL 2 //冷却中状態 #define PELTIER_HEAT 3 //暖房中状態
//Peltierコントローラの差動開始温度 #define PELTIER_STARTING_HEAT_TEMP 22 //暖房開始温度 #define PELTIER_STARTING_COOL_TEMP 28 //冷却開始温度
//Peltierコントローラの差動停止温度 #define PELTIER_STOPING_HEAT_TEMP 24 //暖房停止温度 #define PELTIER_STOPING_COOL_TEMP 26 //冷却停止温度
//ペルチェ状態用変数
int gPeltier_state = PELTIER_VOID;
//ペルチェ状態セット
void set_state(int);
//ペルチェ状態ゲット
int get_state(void);
//ヒーターON
int onheating(void);
//クーラーON
int oncooling(void);
//クーラーヒーターOFF
int offpeltier(void);
//温度表示
float getTemperature( void );
//任意の番号のGPIOをONする
//int iGpio GPIOの番号
//int iMsec ONの時間
int ongpiotime(int iGpio, int iMsec);
//任意の番号のGPIOをOFFする
//int iGpio GPIOの番号
int offgpio(int iGpio);
//
//任意の番号のGPIOをONする
//int iGpio GPIOの番号
int ongpio(int iGpio);
int main(void){
float fTemp = 0xffff;
int i = 0;
set_state( PELTIER_VOID );
printf(" START adjust the temperature \n");
set_state( PELTIER_OFF );
while(1){
sleep(3);
fTemp = getTemperature();
switch (get_state()){
case PELTIER_OFF: //OFF状態
if( fTemp > PELTIER_STARTING_COOL_TEMP ){ //庫内温度が冷却開始温度より高い
oncooling(); //冷却開始
printf("t= %f \n", fTemp);
set_state( PELTIER_COOL );
}else if( fTemp < PELTIER_STARTING_HEAT_TEMP ){ //庫内温度が暖房開始温度低い
onheating(); //暖房開始
printf("t= %f \n", fTemp);
set_state( PELTIER_HEAT );
}
break;
case PELTIER_COOL: //冷却中状態
if( fTemp < PELTIER_STOPING_COOL_TEMP ){ //冷却停止温度
offpeltier(); //ペルチェ停止
printf("t= %f \n", fTemp);
set_state( PELTIER_OFF );
}
break;
case PELTIER_HEAT: //暖房中状態
if( fTemp > PELTIER_STOPING_HEAT_TEMP ){ //暖房停止温度
offpeltier(); //ペルチェ停止
printf("t= %f \n", fTemp);
set_state( PELTIER_OFF );
}
break;
default:
break;
}
i++;
if( i > 20 ){
printf("t= %f \n", fTemp);
i=0;
}
}
return 1;
}
//ペルチェ状態設定
//
//
void set_state(int state ){
gPeltier_state = state;
}
//ペルチェ状態取得
//
//
int get_state(void){
return(gPeltier_state);
}
//ヒーターON
//
//
int onheating(void){
printf("Start Heating \n");
offgpio( GPIO27 );
ongpio( GPIO17 );
return(0);
}
//クーラーON
//
//
int oncooling(void){
printf("Start cooling \n");
offgpio( GPIO17 );
ongpio( GPIO27 );
return(0);
}
//クーラーヒーターOFF
//
//
int offpeltier(void){
printf("OFF \n");
offgpio( GPIO17 );
offgpio( GPIO27 );
return(0);
}
//温度を表示する
//
//
float getTemperature( void ){
int i=0;
float fTemperature = 0xFFFF;
char s[256];
FILE* fp = NULL;
fp = fopen("/sys/bus/w1/devices/28-030997796605/w1_slave", "r");
if( fp == NULL ){
printf("File Open faile \n");
return (fTemperature);
}
for( i=0; i<256; i++){
fread( &s[i] , 1 ,1 ,fp);
}
fclose(fp);
for( i=0;i<256 ;i++ ){
if(( s[i]=='t' )&&( s[i+1]=='=' )){
fTemperature = atoi(&s[i+2]);
fTemperature = fTemperature/1000;
}
}
return( fTemperature );
}
int ongpio(int iGpio){
// printf(">>ON_GPIO %d \n", iGpio);
if(wiringPiSetupGpio() == -1){
printf("GPIO Set NG \n");
return 1;
}
pinMode(iGpio, OUTPUT);
digitalWrite(iGpio, HIGH);
// printf("<<ON_GPIO %d Done \n", iGpio);
}
int offgpio(int iGpio){
// printf(">>OFF_GPIO %d \n", iGpio);
if(wiringPiSetupGpio() == -1){
printf("GPIO Set NG \n");
return 1;
}
pinMode(iGpio, OUTPUT);
digitalWrite(iGpio, LOW);
// printf("<<OFF_GPIO %d Done \n", iGpio);
}
int ongpiotime(int iGpio, int iMsec){
int i;
// printf(">>ON_GPIO %d \n", iGpio);
if(wiringPiSetupGpio() == -1){
printf("GPIO Set NG \n");
return 1;
}
pinMode(iGpio, OUTPUT);
digitalWrite(iGpio, 0);
delay(iMsec/10);
digitalWrite(iGpio, 1);
delay( (iMsec-(iMsec/10) ));
digitalWrite(iGpio, 0);
// printf("<<ON_GPIO %d Done \n", iGpio);
}
コンパイルして実行する
テストをする
温度センサーを手で握ると温度が上がっていきます。printf文のログがコンソールに出力されるので28度を超えるとクーラーが入ることを確認してください。
エッジ側の制御部分は今回で完成です。
次回は醸造庫の組み立て編をアップしたいとおもいます!
アバナード関西 杉本よしひこ
記事に間違い等、不適切な表現がありましたら下記に連絡ください
yoshihiko.sugimoto@avanade.com
この記事が気に入ったらサポートをしてみませんか?