개발자/라즈베리파이4

라즈베리파이4 액츄에이터 7종 제어 C 언어

지구빵집 2022. 6. 29. 08:24
반응형

 

 

 

무겁다. 산을 짊어진 것도 아닌데 무겁다. 다르게 살아보기로 시작한 지 얼마나 되었다고 게으름을 피고 합리화를 하고 벌써 지면 어떡하란 말인가. 여하튼 모르겠다. 매일매일 넘어뜨려야 하는 가장 작은 도미노를 찾아 해 나가는 수밖에 없다. 

 

스마트 IoT 액츄에이터는 워터펌프, 팬, DC모터, 부저, 서보모터, RGB LED, LED 전등까지 7개로 구성하였다. 파일 이름은 actutest.c 로 코드를 입력한다. 전체 구성품을 테스트하는 코드를 맨 아래에 첨부한다. 

 

자세한 도면은 제외하고 라즈베리파이와 7종의 액츄에이터를 연결한 개략적인 연결 블럭도를 아래에 나타낸다. 라즈베리파이 3.3V 출력 신호가 결국 12V로 동작하는 액튜에이터를 동작시키는 회로가 중간에 포함된다. 단지 그것뿐이다.

 

라즈베리파이에 많은 센서와 액츄에이터를 연결하므로 아래와 같은 센서 입출력 보드를 만들었다. 8종의 센서와 7종의 액츄에이터를 연결한다. 센서 보드의 커넥터 할당을 보여준다.

 

 

라즈베리파이 입출력 센서 보드

 

 

각 커넥터에 연결한 센서와 액츄에이터 연결을 보여준다. 할당은 절대적인 것은 아니다. 위치를 달리해 연결했다면 GPIO 번호를 프로그램에서 일치하기만 한다면 동작에는 이상 없다.

 

 

각 커넥터에 연결한 센서와 액츄에이터 연결을 보여준다.

 

 

센서와 액츄에이터에 할당한 GPIO Wiring Pi 핀 번호를 나타낸다. 아래 코드를 보면 GPIO 핀 번호가 WiringPi 라이브러리 핀 번호에 맞게 할당한 것을 볼 수 있다.

 

 

GPIO Wiring Pi 핀 번호

 

 

아래 할당한 액츄에이터 전체를 동작시키고 테스트하는 코드를 참고하기 바란다.

 

 

GPIO 커넥터 연결 블럭도

 

액츄에이터 설명

 

 

각 구성품 테스트 링크는 아래 포스팅을 참고한다.

 

 

라즈베리파이 4 액츄에이터 7종 제어 C 언어

 

 

전체 테스트 코드는 아래와 같다. 1~8번 까지 실행하고 빠져나오는 코드가 있으며, 자세한 컴파일, 실행 방법은 코드 아래에서 설명한다.

 

 

#include <stdio.h>
#include <string.h>
#include <errno.h>

#include <wiringPi.h>

#include "softServo.h"

#define PUMP	21	// BCM_GPIO 5
#define FAN	22		// BCM_GPIO 6
#define DCMOTOR 23	// BCM_GPIO 13
#define BUZCONTROL  28	//GPIO 20

#define RCSERVO  23	//GPIO 23
#define servopwron 27 //27

#define RGBLEDPOWER  24 //BCM_GPIO 19
#define RED	 7
#define GREEN	8
#define BLUE	9

#define LEDBAR	26 // BCM_GPIO 12

void Bplus_pinmodeset(void);
int testmode(void);
int wiringPicheck();

int main (void)
{
    if(wiringPicheck()) printf("Fail\n");    
	
	Bplus_pinmodeset();
	
	while(1)
	{
		int exit;
		exit = testmode();
		if(exit == 1) break;
	}
    
    return 0;
}

int wiringPicheck(void)
{
	if (wiringPiSetup () == -1)
	{
		fprintf(stdout, "Unable to start wiringPi: %s\n", strerror(errno));
		return 1 ;
	}
}

void Bplus_pinmodeset(void)
{
	pinMode (PUMP, OUTPUT);    
	pinMode (FAN, OUTPUT);    
	pinMode (DCMOTOR, OUTPUT);
    pinMode (BUZCONTROL, OUTPUT);
    
    pinMode (LEDBAR, OUTPUT) ;
    
    
	pinMode(RGBLEDPOWER, OUTPUT);
	pinMode(RED, OUTPUT);
	pinMode(GREEN, OUTPUT);
	pinMode(BLUE,OUTPUT);
}

int testmode(void)
{
	int testnum;
	char stop;
	
	printf("Input Number for Smart Farm Actuator Test(1 ~ 4) and Enter !!! \n");
	printf("1. Water Pump Test\n");
	printf("2. Fan Test\n");
	printf("3. DC Motor Test\n");
    printf("4. Buzzer Test\n");
	printf("5. Servo Motor Test\n");
    printf("6. RGB LED Test\n");
    printf("7. LED BAR Test\n");
	printf("8. Exit\n");
	
	scanf("%d", &testnum);
	
	if(testnum == 1)
	{
		printf("here - pump on\n");
		digitalWrite (PUMP, 1) ; // On
		
		delay (2000) ; // ms
		
		digitalWrite (PUMP, 0) ; // Off
		
		delay (2000) ;	
	}
	
	if(testnum == 2)
	{
		printf("here - pump on\n");
		digitalWrite (FAN, 1) ; // On
		
		delay (2000) ; // ms
		
		digitalWrite (FAN, 0) ; // Off
		
		delay (2000) ;
	}
	
	if(testnum == 3)
	{
		digitalWrite(DCMOTOR, 1); //On
		delay (2000) ; // ms
		digitalWrite(DCMOTOR, 0); //OFF
	}
    
    if(testnum == 4)
	{
		digitalWrite(BUZCONTROL, 1);
		delay(1000);
		digitalWrite(BUZCONTROL, 0);
		delay(1000);
        scanf("%c", &stop);
		if(stop == 'c') digitalWrite (BUZCONTROL, 0) ;
        digitalWrite (BUZCONTROL, 0) ;
	}
    
    if(testnum == 5)
	{
        if (wiringPiSetupGpio() == -1)
            return 1 ;

		softServoSetup(RCSERVO,-1,-1,-1,-1,-1,-1,-1);
      
        int i=0;
  
        pinMode(servopwron, OUTPUT);
        delay(1000);
  
        digitalWrite(servopwron, 1);
  
        for( i= 0; i<1 ; i++){
            printf("rc servo on \n");
            delay(1000);
            softServoWrite(RCSERVO, -250);
       
            delay(3000);
        
            printf("rc servo off \n");
  
            softServoWrite(RCSERVO, 1250);
            delay(3000);
        }
        printf("rc servo test end \n");
        digitalWrite(servopwron, 0);
	}
	
	if(testnum == 6)
	{
		digitalWrite(RGBLEDPOWER, 1); // power on
		digitalWrite(RED, 1);
		delay(500);
		digitalWrite(RED, 0);
		digitalWrite(GREEN, 1);
		delay(500);
		digitalWrite(GREEN, 0);
		digitalWrite(BLUE, 1);
		delay(500);
		digitalWrite(BLUE, 0);
		digitalWrite(RGBLEDPOWER, 0); // power off
	}    
    
    if(testnum == 7)
	{
		printf("here - Led Bar on on\n");
		digitalWrite (LEDBAR, 1) ; // On
		
		delay (1000) ; // ms
		
		printf("here - Led Bar on on\n");
		digitalWrite (LEDBAR, 0) ; // Off
		
		delay (1000) ;
	}
	
	if(testnum == 8)
	{
		return 1;
	}    
    	
	return 0;
	
}

 

 

우선 폴더를 이동한다. $cd all_actutest

 

컴파일 명령은 아래와 같고, 서보 모터를 제어하기 위해 헤더 파일을 포함한 것에 주의한다.

 

$ gcc -o actutest actutest.c softServo.c -lwiringPi  

 

컴파일이 잘 실행되었다면 실행은 아래 명령어로 진행한다. 한 가지 주의할 점은 5번 서보모터 동작 실행 후 6번과 7번이 동작하지 않는데 이것은 서보모터 핀 번호가 BCM GPIO 번호로 실행을 해서 나타나는 현상인데 프로그램을 종료하고 다시 $sudo ./actutest 를 실행하여 6번과 7번을 실행하면 이상없이 동작한다. ^^

 

실행은 

 

$sudo ./actutest

 

 

하~ 끝났다. 어서 나가서 놀고 싶다. 5월의 날은 이렇게 좋은데 말이다.  

 

 

pi@raspberrypi:~ $
pi@raspberrypi:~ $ cd all_actutest/
pi@raspberrypi:~/all_actutest $ ls
actutest       buzcontrol.c  ledbar           lightcontrol.c  rcservo    rgbtest.c
actutest.c     dcmotoron     ledbar.c         motorsoftpwm    rcservo.c  softPwm.c
allrgbcolor    dcmotoron.c   ledbarsoftpwm    motorsoftpwm.c  rgbfade    softPwm.h
allrgbcolor.c  fanon         ledbarsoftpwm.c  pumpon          rgbfade.c  softServo.c
buzcontrol     fanon.c       lightcontrol     pumpon.c        rgbtest    softServo.h
pi@raspberrypi:~/all_actutest $ sudo ./actutest
Input Number for Smart Farm Actuator Test(1 ~ 4) and Enter !!!
1. Water Pump Test
2. Fan Test
3. DC Motor Test
4. Buzzer Test
5. Servo Motor Test
6. RGB LED Test
7. LED BAR Test
8. Exit
1
here - pump on
Input Number for Smart Farm Actuator Test(1 ~ 4) and Enter !!!
1. Water Pump Test
2. Fan Test
3. DC Motor Test
4. Buzzer Test
5. Servo Motor Test
6. RGB LED Test
7. LED BAR Test
8. Exit

 

 

 

반응형