*사용 부품

서보모터 1개

LED 2개 (Green, Yellow)

조도센서(CDS) 1개

부저 1개

 

*기능 설명

1. 초음파 센서에 10cm이하의 거리일 때 Servo모터가 작동해서 차단바가 올라가고 부저가 울림

2. CDS센서가 가려지면 LED_Y가 켜지고 LED_G가 꺼짐

 

*동작영상

*전체 소스코드

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <softPwm.h>
#include <softTone.h>
#include <string.h>
#include <errno.h>

#define Buzzer 28
#define Servo 1
#define LED_G 6
#define LED_Y 5
#define micro_trig 23
#define micro_echo 24
#define CDS 7

int Warning[11] = {0,659,0,659,0,659,0,659,0,659,0};

int main ()

{
  
  int start_time, end_time;
  float distance;


  if(wiringPiSetup() == -1) exit(1);
  softToneCreate (Buzzer);

  pinMode(LED_G, OUTPUT);
  pinMode(LED_Y, OUTPUT);
  pinMode(Servo, PWM_OUTPUT);
  pinMode(micro_trig, OUTPUT);
  pinMode(micro_echo, INPUT);
  pwmSetMode(PWM_MODE_MS);
  pinMode(CDS, INPUT);
  pwmSetClock(384);
  pwmSetRange(1000);

  while(1)
  {
	  
	  
	  //초음파센서
    digitalWrite(micro_trig, LOW);
    delay(1500);
    digitalWrite(micro_trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(micro_trig, LOW);
    while (digitalRead(micro_echo) == 0);
    start_time = micros();
    while (digitalRead(micro_echo) == 1);
    end_time = micros();
    distance = (end_time - start_time) / 29. / 2.;
    printf("distance %.2f cm\n", distance);
	//초음파센서 끝
	
 
//초음파센서 + 서보모터 + 부저
	
	//CDS + LED
	
      
	
	if(distance < 10.00 && digitalRead(CDS) == HIGH){
	pwmWrite(Servo, 120);
	digitalWrite(LED_Y, HIGH);
	digitalWrite(LED_G, LOW);

	for (int i = 0; i < 11; ++i)
    {
      
      softToneWrite(Buzzer, Warning[i]);
      delay (200);
    }
      }
  
	else if(distance > 10.00 && digitalRead(CDS) == HIGH){
	pwmWrite(Servo,75);
	digitalWrite(LED_Y, HIGH);
	digitalWrite(LED_G, LOW);
	}
      
	else if(distance < 10.00 && digitalRead(CDS) == LOW){
	pwmWrite(Servo, 120);
	for (int i = 0; i < 11; ++i)
    {
      
      softToneWrite(Buzzer, Warning[i]);
      delay (200);
    }
	digitalWrite(LED_Y, LOW);
	digitalWrite(LED_G, HIGH);
      }
	else if(distance > 10.00 && digitalRead(CDS) == LOW)
	{
	  pwmWrite(Servo,75);
	  digitalWrite(LED_Y, LOW);
	  digitalWrite(LED_G, HIGH);
	  
	}

	
}
  return 0 ;
 }

 

 

라즈베리파이와 브레드보드 연결입니다.

 

사용하려는 GPIO는 GPFSEL1 레지스터에서 GPIO18번을 사용하려고 합니다.

gpio[GPFSEL1/4] |= (1<<24);

GPIO18번의 비트가 24~26비트까지기 떄문에 24~26번째 비트의 값을 001로 바꾸어주면 GPIO18번핀은 출력모드가 됩니다.

 

그리고 다음레지스터들에서 GPIO18번 위치에 해당되는 비트들을 세팅해주면 LED를 ON,OFF시킬수 있습니다.

gpio[GPSET0/4] |= (1<<18); 

 

gpio[GPCLR0/4] |= (1<<18);

 

전체소스코드 입니다.

#include <stdlib.h>    
#include <stdio.h>
#include <unistd.h>    
#include <sys/types.h>    
#include <sys/stat.h>    
#include <fcntl.h>    
#include <sys/mman.h>    
        
        
#define GPIO_BASE 0x3F200000    
#define GPFSEL1   0x04  
#define GPSET0    0x1C  
#define GPCLR0    0x28    
        
        
int main()    
{    
    int fd = open( "/dev/gpiomem", O_RDWR|O_SYNC );    
    if ( fd < 0 ){    
        printf( "can't open /dev/gpiomem \n" );    
        exit(-1);    
    }    
        
        
    char *gpio_memory_map = (char *)mmap( 0, 4096, PROT_READ|PROT_WRITE,    
        MAP_SHARED, fd, GPIO_BASE );    
        
    if ( gpio_memory_map == MAP_FAILED )    
    {    
        printf( " Error : mmap \n" );    
        exit(-1);    
    }    
        
            
    volatile unsigned int* gpio = (volatile unsigned int*)gpio_memory_map;    
    //gpio[GPFSEL1/4] = 0b00000001000000000000000000000000;    
    gpio[GPFSEL1/4] |= (1<<24);    
        
    int i;    
    for ( i=0; i<5; i++ )    
    {    
        //gpio[GPSET0/4] = 0b00000000000001000000000000000000;    
        gpio[GPSET0/4] |= (1<<18);   
        sleep(1);    
        
        //gpio[GPCLR0/4] = 0b00000000000001000000000000000000;   
        gpio[GPCLR0/4] |= (1<<18);  
        sleep(1);    
    }    
        
     munmap( gpio_memory_map, 4096);    
    
    return 0;    
} 

라즈베리파이 2나3에선 /dev/mem 을 사용했지만 라즈베리파이4부터는 /dev/gpiomem 을 사용해서 gpio의 레지스터에 접근해서 사용할 수 있습니다.

 

컴파일 할땐

pi@raspberrypi:~$ g++ led.c -o led

이런식으로 명령어를 사용해주시고 실행할땐 관리자권한이 필요하기 때문에

pi@raspberrypi:~$ sudo ./led

sudo 를 사용해서 관리자권한을 주셔야 합니다.

실행하면 LED가 5번 깜빡이는것을 볼 수 있습니다.

+ Recent posts