見出し画像

TECHBEER エッジ側制御部分組み立て編

ラズパイとブレッドボードをつないでいきます。

電源確保

TECHBEERの発酵コントロールに使う電源の種類は以下の4つです。

とくにコンセントから12V安定化電源に100Vを接続する際は非常に気をつけてください!感電すると火傷、死亡の可能性もあります。
・100V(AC)
・12V(DC)
・5V(DC)
・3.3V(DC)

12V安定化電源の電源配線

モータードライバー、ファンへ12Vを供給するための配線を行います。端子に書かれた+、-のマークを確認して配線してください。

赤丸の部分にAC100Vを供給します。ここは非常に危険です。
感電、ショートに注意、絶縁をしっかりしてください。
感電、火災の原因になります。
一切の責任はもちませんご自身の判断責任で作業をお願いします。

100V安定化電源配線


ファンとペルチェ素子へ12V(DC)の供給

赤丸の方を12V安定化電源につなぎます。オレンジ丸をモータードライバーの出力につなぎます。モータードライバーCytron MD30Cの電源配線の項目の青矢印につなぎます。

ファン赤丸配線2

モータードライバーCytron MD30Cの電源配線

以下の図の左の矢印部分に12Vを供給します。赤色が+で黒色が-です。
右の青矢印はペルチェ素子につなぎます。モータードライバーが+、-の正転、逆転をします。

モータードライバ入力出力両方

ラズパイに5Vの電源供給を行う

赤丸の部分にUSB給電をします。5Vを使う箇所はここだけです。

ラズパイ5V

ラズパイからブレッドボードに3.3Vの電源を供給する

オス-メスジャンパ線を使ってPin番号1番からブレッドボードに3.3vの+を配線します。この図はラズパイのピン配置です。

画像6


3.3Vを温度センサ(DS18B20)に電源を供給する

ブレッドボードの3.3Vから電源を供給します。ラズパイのピンの1番は3.3Vの出力なのでブレッドボードの供給先に送ります。

画像6

温度センサ(DS18B20)の配線をブレッドボードにさせるようにジャンパピンに変更します。

赤 Vcc
黄 Data
黒 GND

画像8

制御線の接続

電源の結線は以上で完了です。ここからは制御の為の結線を進めていきます。配線は以下の通り配線します。以下の配線図を見て組み立ててください。

techbeer_回路図

GPIO4番と温度センサ(DS18B20)との接続

・濃い青丸 温度センサの配線(Vcc Data GND)です。
・2つの緑丸  ラズパイのGNDと温度センサのGND配線です(写真ではラズパイの14番PINに接続しています)。
・2つの水色丸  ラズパイのGPIO4番と温度センサのDataとの配線です。
・オレンジ  4.7KΩ抵抗です。温度センサのDataとVccの間に入れます。

画像9

GPIO27番,17番と3V駆動リレー(Y14H-1C-3DS)の接続

リレーの説明を少しさせて頂きます。リレーの2番と5番に3.3Vを流すと1番と3番がつながります。

1.  動作電源
2.  制御電源(ラズパイのGPIO17,27へ)
3.  動作電源 
4.  使いません
5.  制御電源(ラズパイのGNDへ)
6.  使いません

Y14H-1C-3DSリレー

例えばリレーの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度を超えるとクーラーが入ることを確認してください。

画像13


エッジ側の制御部分は今回で完成です。

次回は醸造庫の組み立て編をアップしたいとおもいます!





アバナード関西 杉本よしひこ
記事に間違い等、不適切な表現がありましたら下記に連絡ください
yoshihiko.sugimoto@avanade.com

この記事が気に入ったらサポートをしてみませんか?