블로그 이미지
조이키트 블로그
아두이노, 라즈베리파이, 반도체 센서/모듈 활용

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

Notice

250x250
2023. 7. 30. 09:38 파이썬
728x90
반응형

먼저 def로 함수 f(x)를 정의한다.

즉 f(x)는 f(x) = x + y 가 된다.

아래 코드에서처럼 y값은 이미 정해져 있고, x값만 변경하여 주면 z = f(x)의 값이 변형된다. 

x = 5인 경우 f(5) = 5 + 1 = 6이 된다.

# 1차 방정식 함수 정의
def f(x):
    y = 1
    x = x + y
    print('x =', x)
    return x
x = 5
y = 2
z = f(x)
print('z =', z)
print('x =', x)
print('y =', y)

출력결과

x = 6
z = 6
x = 5
y = 2
728x90
반응형
posted by 조이키트 블로그
2023. 7. 29. 23:28 파이썬
728x90
반응형

 

# 함수 정의
def max(x, y):
    if x > y: 
        return x
    else:
        return y
    
x = 3
y = 5
print('최대 값 : ', max(x,y))

파이썬에서 def는 함수의 시작을 알리는 예약어이다.

위 코드에서 max는 함수를 호출하기 위해 사용된다. 함수 이름 뒤 괄호 안에 변수 이름들을 나열하는데, 이를 함수의 매개변수라고 한다.

함수가 실제 호출될 때, 형식 매개 변수들은 실 매개변수에 바인딩되며, 이러한 실 매개변수를 인수라고 부른다. 

 

다음과 같이 max(x, y) 함수를 호출하면 형식 매개변수 x는 실 매개변수 3에 바인딩되고, y는 실 매개변수 5에 바인딩된다.

 

출력결과

최대 값 :  5

실행 지점은 함수가 호출된 지점에서 함수의 본체로 이동하며, 본체에 있는 코드는 반환문을 만날 때까지 실행된다. 이 경우 return 뒤에 쓰여진 수식이 함수 호출 값이 되거나 더 이상 실행할 서술문이 없으면 none을 반환하게 된다. 

728x90
반응형
posted by 조이키트 블로그
2023. 7. 29. 22:59 파이썬
728x90
반응형

 

# 이분 검색를 사용한 제곱근의 근사치 찾기
x = 25
epsilon = 0.01
numGuesses = 0
low = 0.0
high = max(1.0, x)
ans = (high + low)/2.0
while abs(ans**2 - x) >= epsilon:
    numGuesses += 1
    if ans**2 < x:
        low = ans
    else:
        high = ans
    ans = (high + low)/2.0
print('numGuesses = ', numGuesses)
print(ans, 'is close to square root of', x)

 

출력결과

numGuesses =  13
5.00030517578125 is close to square root of 25
728x90
반응형
posted by 조이키트 블로그
2023. 7. 29. 21:54 파이썬
728x90
반응형

근사값을 구할 때 가장 보편적으로 사용하는 알고리즘은 아이작  뉴턴이 고안한 것이다.

한 개의 변수를 가진 다항식은 0이거나 0이 아닌 항들의 합이다. 각 항은 상수와 음수가 아닌 값만큼 거듭제곱된 변수의 곱으로 이루어져 있다. 예를 들어 3X^2 + 2X +3이라는 다항식에서 첫 번째 항 3x^2는 상수 3과 제곱된 변수 x의 곱이다.

만약 다항식 p와 실수 r이 있다면 x=r일 때 다항식의 값을 P(r)이라고 할 것이다. 방정식 p=0의 해는 p의 근이다. 즉 P(r)=0이 될 때의 r인 것이다. 그러므로 예를 들어 24의 제곱근의 근사값을 찾는 문제가 주어졌을 때는 x^2 - 24 = 0에서 x의 값을 찾으면 된다.

뉴턴은 어떤 값 guess가 다항식의 근의 근사값일 때 p'가 p의 1차 도함수라고 한다면 guess - P(guess)/P'(guess)가 더 나은 근사값이 된다는 원리를 증명하였다. 어떤 상수 k와 계수 c가 있을 때 cx^2 + k의 1차 도함수는 2cx이다. 또 x^2 - k의 1차 도함수는 2x이다. 그러므로 현재의 추측 값에서 다시한번 y - (y^2 - k)/2y를 구하여 더 나은 근사값을 구할 수 있음을 알 수 있다. 이것을 연속 근사법(successive approximation)이라고 한다.

다음 코드는 이런 방법으로 제곱근의 근사값을 좀 더 빠르게 구하는 것을 구현한 코드이다. 

epsilon = 0.01
k = 24.0
i = 0
guess = k/2.0
while abs(guess*guess - k) >= epsilon:
    i = i + 1
    guess = guess - (((guess**2) - k)/(2*guess))
print('Square root of', k, 'is about', guess)
print('반복회수 : ', str(i))

 

출력결과

Square root of 24.0 is about 4.8989887432139305
반복회수 :  4
728x90
반응형
posted by 조이키트 블로그
2023. 7. 29. 13:25 파이썬
728x90
반응형

2진수를 10진수로 변환하는 함수는 int()이고,

10진수를 2진수로 변환하는 함수는 bin이다.

# 2진수  1001를 10진수로 바꾸기
# 10진수 9를 2진수로 바꾸기

a = int('1001', 2)
b = bin(9)

print('10진수 : ', a)
print('2진수 : ', b)

출력결과 :

10진수 :  9
2진수 :  0b1001

 

728x90
반응형
posted by 조이키트 블로그
2023. 7. 11. 19:20 아두이노 활용
728x90
반응형

하드웨어 구성품

아두이노 나노 R3, 10k옴 가변저항, 푸시버튼, W031 128x64 LCD, DS3231 RTC 리얼타임 클럭 모듈

회로 구성도

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

https://link.coupang.com/a/b2vSOT

 

ATmega328P 마이크로 컨트롤러가 있는 아두이노 우노 R3 개발 보드 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2E2vk

 

TFT 디스플레이 1.3인치 IPS 풀컬러 LCD 모듈 - 액세서리 | 쿠팡

쿠팡에서 4.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 1 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2vTO0

 

아두이노 LCD1602 16x2 4핀 디스플레이 모듈/ Arduino LCD1602 Module - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

 

코딩 : 

#include <U8glib.h>
#include <DS3232RTC.h>
#include <Streaming.h>
#include <Time.h>
#include <Wire.h>

U8GLIB_ST7920_128X64_1X u8g(6, 5, 4 , 7); //Enable, RW, RS, RESET

int X2 = 0;
int Y2 = 0;
int X3 = 0;
int Y3 = 0;
float angulo = 0;
int posicao = 0;
int posicaoh = 0;
int temperatura =0;
int min_temp = 500;
int max_temp = -500;

int ScreenWith = 128;
int ScreenWithC = 96;
int ScreenHeight = 64;
int ScreenHeightC = 32;
#define botao 3

int estado_botao = 0;

char* dia_da_semana[]={
  "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

void tela_1()
{
  u8g.drawRFrame(0, 0, 128, 64, 3);
  u8g.setPrintPos(20, 30);
  u8g.print(temperatura);
  u8g.drawStr( 42, 30, "C");
  u8g.drawCircle(37, 34, 2);
  mostra_relogio_digital();
  fundo_relogio();
  desenha_ponteiro(hour()-1, 12.0, 10);
  desenha_ponteiro(minute()-5, 60.0, 19);
  desenha_ponteiro(second()-5, 60, 21);
}
void tela_2()
{
  u8g.drawRFrame(0, 0, 128, 64, 3);
  u8g.drawRFrame(68, 4, 55, 56, 2);
  mostra_relogio_digital();
  u8g.setFont(u8g_font_5x8);
  u8g.drawStr( 78, 35, "MIN");
  u8g.drawStr( 78, 53, "MAX");
  u8g.setFont(u8g_font_6x13);
  u8g.setPrintPos(25, 41);
  u8g.print(dia_da_semana[(weekday()-1)]);
  u8g.setPrintPos(83, 19);
  u8g.print(temperatura);
  u8g.drawStr( 105, 19, "C");
  u8g.drawCircle(100, 12, 2);
  u8g.setPrintPos(98, 36);
  u8g.print(min_temp);
  u8g.drawCircle(113, 29, 2);
  u8g.setPrintPos(98, 54);
  u8g.print(max_temp);
  u8g.drawCircle(113, 47, 2);
}

void desenha_ponteiro(float valor, float rotacao, int Radius)
{
  angulo = valor * 2.0 * 3.1415 / rotacao - 1,5707;
  X2 = ScreenWithC + Radius * cos(angulo);
  Y2 = ScreenHeightC + Radius * sin(angulo);
  u8g.drawLine(ScreenWithC, ScreenHeightC, X2, Y2);
}
void fundo_relogio()
{
  u8g.drawCircle(ScreenWithC, ScreenHeightC, 27);
  u8g.drawCircle(ScreenWithC, ScreenHeightC, 1);
  u8g.setFont(u8g_font_6x13);
  u8g.setFontPosTop();
  u8g.drawStr(90, 9, "12");
  u8g.drawStr(114, 25, "3");
  u8g.drawStr(94, 44, "6");
  u8g.drawStr(74, 25, "9");

  for(int traco_minuto = 0; traco_minuto<12; traco_minuto++)
  {
    angulo = traco_minuto / 12.0 * 2 * 3.1415;
    X2 = ScreenWithC + 25 * cos(angulo);
    Y2 = ScreenHeightC + 25 * sin(angulo);
    X3 = ScreenWithC + 25 * cos(angulo);
    Y3 = ScreenHeightC + 25 * sin(angulo);
    u8g.drawLine(X2, Y2, X3, Y3);
  }
}


void mostra_relogio_digital()
{
  u8g.setFont(u8g_font_5x8);
  u8g.setPrintPos(8, 55);
  u8g.print(day());
  u8g.drawStr( 19, 55, "/");
  u8g.setPrintPos(24, 55);
  u8g.print(month());
  u8g.drawStr( 35, 55, "/");
  u8g.setPrintPos(41, 55);
  u8g.print(year());
  u8g.drawRBox(3, 4, 62, 21,2);
  u8g.setColorIndex(0);
  u8g.setFont(u8g_font_fub17);
  u8g.drawStr(29,21,":");
  if (hour() < 10)
  {
    u8g.drawStr(3,23,"0");
    posicaoh = 16;
  }
  else posicaoh = 3;
  u8g.setPrintPos(posicaoh, 23);
  u8g.print(hour());
  if (minute() < 10)
  {
    u8g.drawStr(38,23,"0");
    posicao = 51;
  }
  else posicao = 38;
  u8g.setPrintPos(posicao ,23);
  u8g.print(minute());
  u8g.setColorIndex(1);
}
void setup()
{
  pinMode(3, INPUT_PULLUP);
  Serial.begin(9600);
  if ( u8g.getMode() == U8G_MODE_R3G3B2 )
    u8g.setColorIndex(255);     // white
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
    u8g.setColorIndex(3);         // max intensity
  else if ( u8g.getMode() == U8G_MODE_BW )
    u8g.setColorIndex(1);         // pixel on
  setSyncProvider(RTC.get);
  Serial << F("RTC Sync");
  if (timeStatus() != timeSet) Serial << F(" FAIL!");
  Serial << endl;
}

void loop()
{
  temperatura = RTC.temperature() / 4.;
  if (temperatura >= max_temp)
  {
    max_temp = temperatura;
  }
  if (temperatura <= min_temp)
  {
    min_temp = temperatura;
  }
  static time_t tLast;
  time_t t;
  tmElements_t tm;

  if (Serial.available() >= 12) {
    int y = Serial.parseInt();
    if (y >= 100 && y < 1000)
      Serial<<F("Erro: Ano deve ter dois ou quatro digitos!") <<endl;
    else {
      if (y >= 1000)
        tm.Year = CalendarYrToTm(y);
      else    //(y < 100)
      tm.Year = y2kYearToTm(y);
      tm.Month = Serial.parseInt();
      tm.Day = Serial.parseInt();
      tm.Hour = Serial.parseInt();
      tm.Minute = Serial.parseInt();
      tm.Second = Serial.parseInt();
      t = makeTime(tm);
      RTC.set(t);
      setTime(t);
      Serial << F("Horario modificado para: ");
      printDateTime(t);
      Serial << endl;
      while (Serial.available() > 0) Serial.read();
    }
  }
  t = now();
  if (t != tLast) {
    tLast = t;
    printDateTime(t);
    Serial << endl;
  }

  boolean valor_botao = digitalRead(3);
  if (valor_botao != 1)
  {
    while(digitalRead(3) != 1)
    {
      delay(100);
    }
    estado_botao = !estado_botao;
  }

  u8g.firstPage();
  do {
    if (estado_botao == 0)
    {
      tela_1();
    }
    if (estado_botao == 1)
    {
      tela_2();
    }
  }
  while( u8g.nextPage() );
  delay(10);
}

void printDateTime(time_t t)
{
  printI00(day(t), 0);
  Serial << monthShortStr(month(t)) << _DEC(year(t));
  Serial << ' ';
  printI00(hour(t), ':');
  printI00(minute(t), ':');
  printI00(second(t), ' ');
}

void printI00(int val, char delim)
{
  if (val < 10) Serial << '0';
  Serial << _DEC(val);
  if (delim > 0) Serial << delim;
  return;
}
728x90
반응형

'아두이노 활용' 카테고리의 다른 글

아두이노 음성인식  (0) 2020.08.07
posted by 조이키트 블로그
728x90
반응형

아두이노에서 키패드와 LCD 디스플레이, 5V 릴레이를 사용하여 키패드 도어락을 만드는 법을 알아보겠다.

 

구성요소 : 아두이노 우노 R3, 4X4키패드, LCD1602 디스플레이 듈, 5V릴레이 모듈

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

https://link.coupang.com/a/b2vSOT

 

ATmega328P 마이크로 컨트롤러가 있는 아두이노 우노 R3 개발 보드 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2vTO0

 

아두이노 LCD1602 16x2 4핀 디스플레이 모듈/ Arduino LCD1602 Module - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FDaB

 

4X4 매트릭스 키보드 배열 모듈 16 키 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FEbX

 

아두이노 릴레이 1채널 5V 모듈 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

아두이노에 다음과 같이 회로를 구성한다.

회로 구성도

 

회로 결선도

아두이노 우노 R3 4X4 키패드 LCD 1602 릴레이 모듈
+5V   VCC VCC
GND   GND GND
D2 colPin2    
D3 colPin3    
D4 colPin4    
D5 colPin5    
D6 rowPin6    
D7 rowPin7    
D8 rowPin8    
D9 rowPin9    
A4   SDA  
A5   SCL  
D12     IN

 

위와 같이 회로를 구성한 다음 아두이노 IED에 LCD 및 키패드 라이브러리를 설치해야 한다.

설치 방법은 Sketch/Include Library/Manage Libraries에 들어간 다음 검색창에 LiquidCrystal_I2C 와 Keypad를 입력한 다음 설치하여 주면 된다.

 

 

코딩 :

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

#define Password_Length 6 // 패스워드 길이 설정

int signalPin = 12;  

char Data[Password_Length]; 
char Master[Password_Length] = "1234*";   
byte data_count = 0, master_count = 0;
bool Pass_is_good;
char customKey;

const byte ROWS = 4;  // 키패드 행수 설정
const byte COLS = 4;  // 키패드 열수 설정

char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {9, 8, 7, 6};  // 키패드 행핀 D6 ~ D9 설정
byte colPins[COLS] = {5, 4, 3, 2};  // 키패드 열핀 D2 ~ D5 설정

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

LiquidCrystal_I2C lcd (0x27,16,2);   // LCD1602 hexa값, 2행 16열 설

void setup(){

  lcd.init(); 
  lcd.backlight();
  pinMode(signalPin, OUTPUT);
  digitalWrite(signalPin, LOW);
}

void loop(){

  lcd.setCursor(0,0);
  lcd.print("PASSWORD_INPUT");

  customKey = customKeypad.getKey();
  if (customKey){
    Data[data_count] = customKey; 
    lcd.setCursor(data_count,1); 
    lcd.print(Data[data_count]); 
    data_count++; 
    }

  if(data_count == Password_Length-1){
    lcd.clear();

    if(!strcmp(Data, Master)){
      lcd.print("DOOR_OPEN");
      digitalWrite(signalPin, HIGH); 
      delay(3000);
      digitalWrite(signalPin, LOW);
      }
    else{
      lcd.print("ERROR");
      delay(3000);
      }
    
    lcd.clear();
    clearData();  
  }
}

void clearData(){
  while(data_count !=0){
    Data[data_count--] = 0; 
  }
  return;
}

 

코딩 중 char Master[Password_Length] = "1234*";   에서 1234*대신 자신의 비밀번호로 대체하여 변경할 수 있다.

암호 길이는 #define Password_Length 6에서 예를 들면 비밀번호 길이가 7자이면 길이를 8으로 입력하면 된다.

 

결과 화면

https://www.youtube.com/watch?v=EOxbbC2z40s

 

 

 

아두이노 우노 R3 : https://smartstore.naver.com/allbrands/products/7641474076

 

아두이노 우노 R3 : All Brands

[All Brands] 전자부품 전문쇼핑몰입니다

smartstore.naver.com

4X4키패드 : https://smartstore.naver.com/allbrands/products/7791417895

 

4X4 매트릭스 키보드 배열 모듈 16 키 : All Brands

[All Brands] 전자부품 전문쇼핑몰입니다

smartstore.naver.com

16x1 12c LCD 디스플레이 : https://smartstore.naver.com/allbrands/products/7649718878

 

아두이노 LCD1602 16x2 4핀 디스플레이 모듈/ Arduino LCD1602 Module : All Brands

[All Brands] 전자부품 전문쇼핑몰입니다

smartstore.naver.com

5V릴레이 모듈 : https://smartstore.naver.com/allbrands/products/7640778967

 

All Brands : All Brands

릴레이 모듈

smartstore.naver.com

 

728x90
반응형
posted by 조이키트 블로그
2021. 2. 4. 11:56 라즈베리파이
728x90
반응형

1 라즈베리파이 하드웨어 특징

라즈베리파이는 핀이 노출되어 아두이노와 같은 방식으로 외부 하드웨어를 제어할 수 있다. 

LED, 버튼 등의 외부 회로를 구성할 수 있다.

 

또한 모터 쉴드를 장착하여 모터를 제어할 수 있다.

라즈베리파이는 I2C, SPI 통신 모듈을 내장하고 있다. 이 통신 모듈에 외부 모듈을 연결하여 센서 입력, 모터 출력 등을 수행할 수 있다. 

2 라즈베리파이 개발 환경 구성하기

라즈베리파이 이미지를 설치하고 라즈베리파이 환경을 설정한다. 

라즈베리파이 이미지는 micro SD 카드에 설치해야 한다. 

01 micro SD 카드를 카드 리더기에 장착한 후 카드 리더기의 USB 단자를 PC에 연결한다.

다음 사이트에 접속한다. : hppt://downloads.raspberrypi.org/raspbian/images/

다음 디렉터리로 이동한다.

여기서 다음파일을 다운받는다.

다운로드가 완료되면 압축 이미지를 풀어준다.

 

Raspberry Pi Imager 설치

Raspberry Pi Imager 프로그램을 다운받고 설치한다.

다음 사이트에 접속 : https://www.raspberrypi.org/downloads/ 

 

Raspberry Pi OS – Raspberry Pi

The Raspberry Pi is a tiny and affordable computer that you can use to learn programming through fun, practical projects. Join the global Raspberry Pi community.

www.raspberrypi.org

다음과 같이 페이지로 이동한 다음 OS 환경에 따라 세가지 방법 중 하나를 선택할 수 있다. 

실행파일을 클릭하여 설치를 진행한다. 

설치 완료 후 Finish를 누른다.

다음과 같이 Raspberry Pi Imager 프로그램이 실행된다. 이 프로그램을 이용하여 라즈베리파이 이미지를 마이크로 SD카드에 쓴다. 

실행화면에서 CHOOSE OS를 클릭한다.

펼쳐진 대화창에서 Use custom을 클릭한다.

그러면 Select image창이 뜬다.

그러면 다음과 같이 표시된다.

다음은 CHOOSE SD CARD 버튼을 누른다.

USB 단자를 통해 PC에 연결된 카드를 선택한다. 그러면 다음과 같이 표시된다.

Write 버튼을 눌러 이미지를 micro SD 카드에 쓴다.

 

728x90
반응형

'라즈베리파이' 카테고리의 다른 글

라즈베리파이로 아두이노 제어하기  (0) 2020.09.05
posted by 조이키트 블로그
2020. 9. 5. 13:31 라즈베리파이
728x90
반응형

라즈베리 파이로 아두이노를 제어하기 위해서는 먼저 pyFirmate를 라즈베리파이에 설치하여야 한다.

다음 pyFirmate를 설치하기 위해서는 LXTerminal를 실행해주고 다음 명령어를 입력한다.

"sudo apt-get install python-pip python-serial"

Enter키를 누르면 다음과 같이 "계속하겠는가[Y/n]?"라는 문구가 나온다.

 여기서 Y를 입력하고, 다음과 같이 pyfirmata 설치 명령어를 입력한다.

설치가 끝나면 이제 LED를 아두이노에 연결하여 라즈베리파이로 제어해보도록 하겠다.

 

준비품 : LED_1개, 300옴 저항_1개, 10k옴 저항_1개, 버튼_1개

 

준비가 완료되면 다음과 같이 회로를 만든다.

 

위와 같이 회로가 완성되면 다시 라즈베리파이의 LXTerminal에서 나노 편집기를 실행하여 준다.

여기서 다음과 같이 파이썬 코딩을 한다.

파이썬 코드
from pyfirmata import Arduino, util
import time

board = Arduino('/dev/ttyACM0')
pin_button = board.get_pin('d:9:i')
it = util.lterator(board)
it.start()
pin_button.enable_reporting()

while True:
if pin_button.read():
board.digital[10].write(1)
else:
board.digital[10]

time.sleep(0.01)

 

728x90
반응형

'라즈베리파이' 카테고리의 다른 글

라즈베리파이란?  (0) 2021.02.04
posted by 조이키트 블로그
728x90
반응형

TSOP1838  IR 적외선 센서를 사용하여 리모컨으로 아두이노를 제어하는 프로젝트를 만들어 보겠다.

 

 

이를 위해서는 TSOP1838  IR 적외선 감지센서와 리모컨 모듈을 사용하여 리모컨에서 받은 신호를 감지하고, 해당 신호에 따라 아두이노가 작동하도록 프로그래밍 해야 한다.

 

동작 : 아두이노에 적외선 센서를 연결하여 리모컨으로 LED와 릴레이 모듈을 제어하는 기능을 수행한다.

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

https://link.coupang.com/a/b2vSOT

 

ATmega328P 마이크로 컨트롤러가 있는 아두이노 우노 R3 개발 보드 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FHco

 

TSOP1838 적외선 37.9Khz 수신기 모듈 - LED모듈/조명모듈 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FEbX

 

아두이노 릴레이 1채널 5V 모듈 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FJHB

 

MCU HX1838 적외선 무선 리모컨 키트 - 리모컨 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FIQq

 

12V 1채널 리모컨 제어 릴레이 모듈 - 기타전기설비부자재 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

 

준비품 : 아우이노UNO R3, TSOP1838  IR 적외선 센서, 적외선 리모컨, LED_red, LED_blue, 릴레이  모듈, 300옴 저항_2개

 

아두이노UNO
적외선 리모컨
LED_red_blue
릴레이 모듈
아두이노 우노 R3 TSOP1838  IR 적외선 센서  적외선 리모컨 LED 릴레이 모듈
300옴 저항
       
300옴 저항        

 

회로 결선도

아두이노 적외선 센서 릴레이 모듈 LED red LED blue
+5V VCC VCC    
GND GND GND GND GND
A0 S      
D7   IN    
D8     "+"  
D9       "+"

아두이노와 적외선센서 회로연결

위 회로에서 릴레이 모듈의 VCC를 아두이노의 +5V에 연결하고, 릴레이 모듈의 IN을 아두이노핀의 A0에 연결한다.

다음은 실지 회로도이다.

아두이노, 적외선 센서, 릴레이모듈, LED 연결 회로

 

위와 같이 회로를 구성하고 아두이노IDE에 코드를 작성한다.

 

코딩 

#include <IRremote.h>   // 적외선 함수 라이브러리 선언
int RECV_PIN = A0;    // 적외선 센서 신호를 아날로그핀 A0로 송수신 함
int led_red = 8;  // LED red를 D8로 선언
int led_blue = 9;  // LED blue를 D9로 선언
int swich = 7;    // 릴레이 입력을 D7로 선언

IRrecv irrecv(RECV_PIN);  //  IRremote를 사용하기 위해 irrecv객체 생성
decode_results results;   // 디코드한 결과 값

void setup()
{
 Serial.begin(9600);
  irrecv.enableIRIn();  // Start the receiver
  pinMode(led_red, OUTPUT);  // LED red
  pinMode(led_blue, OUTPUT);  // LED blue
  pinMode(swich, OUTPUT); // swich_on/off
  }

  void loop(){
  if(irrecv.decode(&results)){  // 적외선 리모컨의 신호를 받을 때
  Serial.println(results.value, HEX);  // 결과값을 HEX로 출력
  switch (results.value){
      case 0x80c: digitalWrite(8, HIGH); break; //전원버튼이 눌리면 LED_red ON
      case 0xc: digitalWrite(8, LOW); break; //전원버튼이 다시 눌리면 LED_red OFF
      case 0x80b: digitalWrite(9, HIGH); break; //AV/TV 버튼이 눌리면 LED_blue ON
      case 0xb: digitalWrite(9, LOW); break; //AV/TV버튼이 눌리면 LED_blue OFF
      case 0x80d: digitalWrite(7, HIGH); break; // CH_up버튼이 눌리면 swich ON
      case 0xd: digitalWrite(7, LOW); break;  // CH_down버튼이 눌리면 swich OFF    
        }
       irrecv.resume();  // 수광 다이오드 다음 값 받기
}
}

 

위의 코딩에서 HEX값인 0x80c, 0xc, 0x80b, 0xb, 0x80d, 0xd는 아두이노를 USB케이블을 연결하고 실행한 다음 리모컨으로 버튼을 눌렀을 때 아두이노 IDE의 툴/ 시리얼 모니터를 실행하면 해당버튼을 눌렀을 때에 따른 HEX값이 출력된다. 

리모컨 버튼 기능마다 HEX값이 다르므로 시리얼 모니터를 확인하고 출력된 값을 코딩에 입력하면 된다.

 

시리얼 모니터 출력 결과

리모컨을 눌렀을 때 시리얼 모니터 출력

 

다음은 리모컨을 눌렀을 때 LED와 릴레이 모듈을 제어하는 영상이다.

 

출력 결과

https://www.youtube.com/watch?v=hI1UjD9TyUo

 

 

728x90
반응형
posted by 조이키트 블로그
2020. 8. 7. 00:23 아두이노 활용
728x90
반응형

도트 매트릭스를 음성인식 모듈로 제어하는 예제

준비품 : 아두이노UNO, 음성인식 모듈(SZH-SM001), USB to TTL컨버터 모듈, 도트 매트릭스, 마이크

아두이노UNO
음성인식 모듈(SZH-SM001)

 

USB to TTL
도트매트릭스
마이크

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

https://link.coupang.com/a/b2vSOT

 

ATmega328P 마이크로 컨트롤러가 있는 아두이노 우노 R3 개발 보드 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FMU8

 

PL2303HX USB-RS232 TTL 컨버터 모듈 - USB허브 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

 

음성인식 모듈은 최대 15개의 음성 명령을 저장할 수 있다.

음성 명령은 3개의 그룹으로 나뉘며, 각 5개의 음성 명령이 저장된다.

먼저 그룹별로 음성 명령어를 모듈에 저장한 후 사용할 그룹을 선택해야 한다.

1) 음성인식 모듈을 PC와 연결하기 위해 USB to TTL 컨버터와 음성인식 모듈을 연결해준다.

음성인식 모듈 USB to TTL 컨버터
VCC 5V
GND GND
RXD TXD
TXD RXD

음성인식 모듈과 USB to TTL 컨버터를 연결한 후 PC의 장치관리자에서 포트 번호를 확인할 수 있다.

여기서 Silicon Labs CP210x USB to UART Bridge(COM4)가 음성인식 모듈을 인식한 결과이다.

다음 AccessPort라는 시리얼 통신 프로그램을 사용하여 음성인식 명령어를 녹음하다.

아래 압축 프로그램을 컴퓨터에 설치하여 실행하면 된다.

AccessPort137.zip
0.46MB

해당 프로그램을 실행시킨 후 왼쪽 상단을 보면 노란색과 초록색의 톱니바퀴 모양의 Configuration아이콘을 눌러준다. 

Options 창에서 USB to TTL 컨버터와 연결된 Port 번호를 입력하고, Baud Rate는 9600으로 맞춰준다. (장치 관리자에서 확인한 포트 번호를 입력해준다. COM4)

Send display는 Hex format으로 Receive display는 Char Format으로 설정해준 후, OK 버튼을 눌러준다. 이 후 Hex 명령어로 ‘AA36’을 Send 버튼을 통해 보내주었을 때, Common Mode라는 답변이 온다면, 제대로 연결된 것이다

Hex 명령어로 ‘AA11’을 보내주시면, 음성 명령어 녹음이 시작된다.

음성인식 모듈의 마이크에 대고 명령어를 녹음해주시면 된다.

각 명령의 길이는 최대 1300ms(1.3초)이므로, 단어로 명령을 넣는 게 좋다.

녹음을 시작하면, 한 그룹의 5가지 음성 명령 녹음을 끝내기 전까지 녹음 과정을 멈출 수 없는 점 유의해 주시기 바란다.

START라는 답변이 오면 명령어를 녹음해주시면 된다.

No Voice, Different등을 통해 이전 녹음과 다른지, 녹음이 되고 있는지 확인 가능하다.

Finish one이 나오면 1개의 명령어가 녹음 되었다는 뜻이다.

순차 적으로 5개 모두 녹음 완료되면, Group 1 finish라고 답변이 온다.

이후 Hex 명령어로 ‘AA21’을 보내주시면, Group1 Imported라는 답변이 온다.

첫 번째 그룹의 5개의 명령어 입력이 끝났다.

첫 번째 그룹의 명령어만 입력 완료해도 5개의 명령어로 제어할 수 있다.

 

명령어 리스트

Common Mode는 음성 명령 값을 ‘Result:11’과 같은 ASCII 코드값으로 전달해 주지만,

Compact Mode는 음성 명령 값을 ‘11’과 같은 Hex 값으로 전달해준다.

따라서 처음 PC와 음성인식 모듈을 연결하여 음성 명령을 녹음할 때는, Common Mode로 녹음 하는게 좋고 아두이노 등의 플랫폼에서 사용할 때는, Compact Mode로 사용해야 한다.

음성 명령어는 녹음할 때 사용자의 목소리 위주로 인식하기 때문에, 다른 사람이 명령어를 넣으면 제대로 작동하지 않을 수 있다.

 

다음 아두이노와 음성인식 모듈, 도트매트릭스를 아래와 같이 연결한다.

 

아두이노 음성인식 모듈 도트매트릭스 모듈
5V VCC VCC
GND GND GND
D2 TxD  
D3 RxD  
D5    
D10   CS
D11   CLK
D12   DIN

 

다음 아두이노IDE를 실행하여 다음과 같이 코딩한다.

#include "LedControl.h" // 라이브러리 사용 선언
#include <SoftwareSerial.h> // 소프트웨어 Serial 통신 라이브러리 사용
// Serial 통신핀으로 D11번핀을 Rx로, D10번핀을 Tx로 선언
SoftwareSerial mySerial(2, 3); // 모듈 TX=11번핀 , RX=10번핀 연결
// Din 핀을 12번, ClK핀을 11번 CS핀을 10번에 연결
// 매트릭스는 1개를 사용 선언
LedControl lc=LedControl(12,11,10,1);
int voice_recogn=0;
byte data[5][8]=
{
// 숫자 1 출력
{
B11111111,
B10000001,
B10100101,
B10000001,
B10000001,
B10111101,
B10000001,
B11111111
},
// 숫자 2 출력
{
B11111111,
B10000001,
B10100101,
B10000001,
B10100101,
B10111101,
B10000001,
B11111111
},

// 숫자 3 출력
{
B00011000,
B00011000,
B00011000,
B11111111,
B11111111,
B00011000,
B00011000,
B00011000
},
// 숫자 4 출력
{
B00000000,
B01100110,
B11111111,
B11111111,
B11111111,
B01111110,
B00111100,
B00011000
},
// 숫자 5 출력
{
B00111100,
B01000010,
B10100101,
B10000001,
B10100101,
B10011001,
B01000010,
B00111100
}
};
void setup()
{
Serial.begin(9600); // 통신 속도 9600bps로 PC와 시리얼 통신 시작
mySerial.begin(9600); // 통신 속도 9600bps로 모듈과 시리얼 통신 시작
lc.shutdown(0,false); // 0~3번까지 매트릭스 절전모드 해제
lc.setIntensity(0,8); // 매트릭스의 밝기 선언 0~15의 수
lc.clearDisplay(0); // 매트릭스 led를 초기화
Serial.println("wait settings are in progress");
delay(1000);
mySerial.write(0xAA); // compact mode 사용
mySerial.write(0x37);
delay(1000);
mySerial.write(0xAA); // 그룹1 음성 명령어 imported
mySerial.write(0x21);
Serial.println("The settings are complete");
}
void loop()
{
while(mySerial.available())
{
Serial.println("voice input");
voice_recogn=mySerial.read();
switch(voice_recogn)
{
case 0x11:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[0][j]); // 숫자 1 출력
}
Serial.println("숫자 1 출력");
break;
case 0x12:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[1][j]); // 숫자 2 출력
}
Serial.println("숫자 2 출력");
break;
case 0x13:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[2][j]); // 숫자 3 출력
}
Serial.println("숫자 3 출력");
break;
case 0x14:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[3][j]); // 숫자 4 출력
}
Serial.println("숫자 4 출력");
break;
case 0x15:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[4][j]); // 숫자 5 출력
}
Serial.println("숫자 5 출력");
break;
}
}
}
 

 

다음 아래와 같이 음성명령에 따라 토트매트릭스에 숫자가 출력되는 것을 볼 수 있다.

 

728x90
반응형

'아두이노 활용' 카테고리의 다른 글

128x64 LCD를 활용한 디지털 시계 및 온도계  (0) 2023.07.11
posted by 조이키트 블로그
2020. 8. 1. 09:57 아두이노 기초
728x90
반응형

컬러센서를 사용하여 3색 LED를 감지하는 아두이노 프로젝트를 만들어 보겠다.

이 프로젝트에서는 TCS3200 컬러센서를 사용하여 주변의 색을 감지하고, 그 결과에 따라 3색 LED를 제어할 것이다.

 

다음은 필요한 부품들이다.

  1. TCS3200 컬러센서
  2. 3색 LED
  3. 아두이노 보드
  4. 저항 (330옴 x 3)
  5. 점퍼 와이어

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

 

https://link.coupang.com/a/ccbDIm

 

(당일배송) 아두이노 TCS3200 컬서 센서 Color Sensor - 케이블 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2vSOT

 

ATmega328P 마이크로 컨트롤러가 있는 아두이노 우노 R3 개발 보드 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2vTO0

 

아두이노 LCD1602 16x2 4핀 디스플레이 모듈/ Arduino LCD1602 Module - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

먼저, TCS3200 컬러센서를 아두이노에 연결해야 한다. 그런 다음, 아래의 코드를 사용하여 컬러센서를 통해 검출된 색을 읽고, 해당하는 색에 따라 LED를 제어할 수 있다.

 

전체 코딩:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>  // LCE패널 함수 선언


#define S0 6  // 컬러센서 S0 D6번 설정
#define S1 7  // 컬러센서 S1 D7번 설정
#define S2 8  // 컬러센서 S2 D8번 설정
#define S3 9  // 컬러센서 S3 D9번 설정
#define sensorOut 10  // 컬러센서 출력  D10번 설정
#define redPin 11     // LED_RED D11번 설정
#define greenPin 12   // LED_BLUE D12번 설정
#define bluePin 13    // LED_GREEN D13번 설정

int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;

LiquidCrystal_I2C lcd (0x27,16,2);   // LCD1602 설정

void setup() {

  lcd.init();           // LCD 초기화
  lcd.backlight();      // LCD 뒷 전등 켬

  pinMode(S0, OUTPUT); // 출력
  pinMode(S1, OUTPUT); //
  pinMode(S2, OUTPUT); //
  pinMode(S3, OUTPUT); //
  pinMode(sensorOut, INPUT); // 입력
  pinMode(redPin, OUTPUT);  // 출력
  pinMode(greenPin, OUTPUT); //
  pinMode(bluePin, OUTPUT); //

  // 주파수 스케일링을 20%로 설정
  digitalWrite(S0,HIGH);
  digitalWrite(S1,LOW);

  Serial.begin(9600);
}

void loop() {
  // 빨간색 필터링된 포토다이오드를 읽을 수 있도록 설정
  digitalWrite(S2,LOW);
  digitalWrite(S3,LOW);
  // 빨간색 출력 주파수 판독
  redFrequency = pulseIn(sensorOut, LOW);

  // 시리얼 모니터에 값 출
  Serial.print("R = ");
  Serial.print(redFrequency);
  delay(100);
    
  lcd.setCursor(0, 0);
  // 측정된 RED 값을 LCD에현시
  lcd.print("R:");
  lcd.print(redFrequency); //주파수
 

  // 녹색 필터링된 포토다이오드를 읽도록 설정
  digitalWrite(S2,HIGH);
  digitalWrite(S3,HIGH);
  // 녹색 출력 주파수 판독
  greenFrequency = pulseIn(sensorOut, LOW);

  // 시리얼 모니터에 녹색 값 출력
  Serial.print(" G = ");
  Serial.print(greenFrequency);
  delay(100);

    lcd.setCursor(7, 0);
  // 측정된 GREEN 주파수 값을 LCD에현시
  lcd.print("G:");
  lcd.print(greenFrequency);  //주파수


  // 파란색 필터링된 포토다이오드를 읽을 수 있도록 설정
  digitalWrite(S2,LOW);
  digitalWrite(S3,HIGH);
  // 파란색 출력 주파수 판독
  blueFrequency = pulseIn(sensorOut, LOW);

  // 시리얼 모니터에 파란색 값 출력
  Serial.print("B:");
  Serial.println(blueFrequency);
  delay(100);

  lcd.setCursor(0, 1);
  // 측정된 BLUE 주파수 값을 LCD에현시
  lcd.print("B:");
  lcd.print(redFrequency);     //주파수
 

  // 검출된 색상을 기반으로 한 LED 제어
  if (redFrequency > greenFrequency && redFrequency > blueFrequency) {
    // Red LED 출력
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, LOW);

  } else if (greenFrequency > redFrequency && greenFrequency > blueFrequency) {
    // Green LED 출력
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, HIGH);
    digitalWrite(bluePin, LOW);
  } else if (blueFrequency > redFrequency && blueFrequency > greenFrequency) {
    // Blue LED 출력
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, HIGH);
  } 
  
  else if (redFrequency == greenFrequency && redFrequency == blueFrequency) {
    // 모든 LED 출력
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, HIGH);
    digitalWrite(bluePin, HIGH);
  } else {
    // 모든 LED 전부 꺼짐
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, LOW);
  }
}

 

준비물 : 아두이노 우노, RGB 컬러센서, 3색 LED, 300옴 저항 등이 사용된다.

 

아두이노UNO
컬러센서
3색 LED
300옴 저항
아두이노 우노 R3 RGB 컬러센서 3색 LED 300옴 저항

 

 

회로 연결 : 

아두이노 우노 R3 RGB 컬러센서 RGB LED 다이오드 LCD1602
+5V VCC +핀 VCC
GND GND   GND
D6 S0    
D7 S1    
D8 S2    
D9 S3    
D10 OUT    
D11   RED  
D12   GREEN  
D13   BLUE  
A4     SDA
A5     SCL

 

회로도:

색상감지센서 회로도

 

 

 

위와 같이 회로를 연결하고 코드를 아두이노에 업로드하면 시리얼 모니터와 LCD에 색상에 따른 값이 출력될 것이다.

이 코드는 컬러센서를 통해 검출된 색에 따라 3색 LED를 제어한다. 따라서 감지된 색에 따라 LED가 변할 것이다.

 

출력 결과

https://www.youtube.com/watch?v=uT4cFhvfGSk

 

728x90
반응형
posted by 조이키트 블로그
2020. 7. 28. 10:42 아두이노 기초
728x90
반응형

아두이노에 LCD 패널을 연결하여 초음파 센서에서 측정된 거리를 표시하는 프로젝트를 만들어 보겠다.

이 프로젝트에서는 LCD에 거리 값을 표시하고, 초음파 센서를 사용하여 거리를 측정한다.

아래는 이를 위한 간단한 코드입니다.

 

코딩

#include <Wire.h>
#include <LiquidCrystal_I2C.h>  // LCE패널 함수 선언

// 초음파센서의 Trig, Echo 핀을 매크로 상수로 선언
#define TRIG 2
#define ECHO 3
// 삼색 LED의 R, G, B에 해당하는 핀들을 매크로 상수로 선언
#define RED 11
#define GREEN 10
#define BLUE 9

LiquidCrystal_I2C lcd (0x27,16,2);   

void setup() {
// 초음파센서의 Trig를 출력모드, Echo를 입력 모드로 설정

  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
  lcd.init();           // LCD 초기화
  lcd.backlight();      // LCD 뒷 전등 켬

}

void loop() {
// 초음파센서의 Trig에서 초음파를 발사하는 코드
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

// pulseIn 명령어를 통해 Echo핀에 초음파가 들어오는 시간 계산
// 반환된 값에 58.2를 나누어 시간을 cm로 변경
  long distance = pulseIn(ECHO, HIGH)/58.2;

// 3색 LED의 R, G, B를 모두 255로 설정하여 LED를 끔
  analogWrite(RED, 255);
  analogWrite(GREEN, 255);
  analogWrite(BLUE, 255);

    if(distance < 10){
    // 거리가 10cm 이내이면 빨간색으로 표시
    analogWrite(RED, 0);
  }else if(distance < 20){
    // 거리가 10 ~ 20 이내이면 초록색으로 표시
    analogWrite(GREEN, 0);
  }else if(distance < 30){
    // 거리가 20 ~ 30 이내이면 파란색으로 표시
    analogWrite(BLUE, 0);    
  }

// LCD에서 한번 현시되고 측정된 값이 바뀌면 지우고 다시 현시 
 lcd.clear();
// LCD의 커서를 첫번째 열에 두번째행으로 설정     
  lcd.setCursor(0, 0);

// 측정된 거리값을 LCD에현시
  lcd.print(distance);
  lcd.print(" cm ");     // 측정 값 뒤에 "cm"글자 표시
  delay(200);     // 0.2초간 지연

}

 

준비품 : 아두이노 UNO, LiquidCrystal_I2C, 초음파센서, 3색 LED, 300옴 저항 (3개)

아두이노 UNO
LiquidCrystal_I2C
초음파 센서
3색 LED
300옴 저항
아두이노 우노 R3 LCD 1602 디스플레이 초음파센서 3색 LED 300옴 저항

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

https://link.coupang.com/a/b2vSOT

 

ATmega328P 마이크로 컨트롤러가 있는 아두이노 우노 R3 개발 보드 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2vTO0

 

아두이노 LCD1602 16x2 4핀 디스플레이 모듈/ Arduino LCD1602 Module - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FRps

 

HC-SR04 초음파 거리 측정 모듈 - 기타측정도구 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

다음과 같이 빵판에 요소들을 연결한다.

 

LCD패널의 VCC는 아두이노의 +5V에 연결하고, GND는 아두이노 GND에 연결한다.

다음 LCD패널의 SDA는 아두이노의 아날로그 핀의 A5에 연결하고, SCL은 A4에 연결한다.

초음파센서의 TRIG는 아두이노의 디지털핀인 D2번, ECHO는 D3에 연결한다.

그리고 초음파센서의 VCC와 GND는 공동으로 LCD패널과 같이 연결한다. 

다음 3색LED의 2번은 +5V에 연결하고 LED의 1, 3, 4번 즉 RED, GREEN, BLUE는 300옴 저항을 거쳐 아두이노 디지털핀인 D11, D10, D9 순으로 연결한다.

 

회로 연결이 전부 끝나면 아두이노IED에서 다음 아래에 있는 파일을 실행하여 아두이노IDE의 시리얼 모니터를 출력하면 address 뒤에 0x00값을 아래 코딩에서 LiquidCrystal_I2C lcd (0x27,16,2);  (예를들면 0x27)을 입력한다.

 

lcd_0x00.txt
0.00MB

 

 

 

코딩이 끝나면 컴파일하고 업로드 시켜주면 다음과 같이 회로의 LCD패널이 초음파센서에서 측정된 거리가 현시됨을 볼수 있다.

 

출력 결과

https://www.youtube.com/watch?v=8AiOaMY7if0

 

 

728x90
반응형
posted by 조이키트 블로그
2020. 7. 28. 10:39 아두이노 기초
728x90
반응형

아두이노와 초음파센서를 사용하여 거리에 따라 LED 색을 변하는 프로젝트를 만들 수 있다.

아래는 간단한 예시 코드이다. 이 코드는 초음파센서로 측정된 거리에 따라 RGB LED의 색상을 변화시킨다.

거리가 가까워지면 빨간색에서 시작하여 멀어질수록 파란색으로 변화한다.

 

코딩 

// 초음파 센서 핀 정의
#define trigPin 13
#define echoPin 12

// RGB LED 핀 정의
#define redPin 9
#define greenPin 10
#define bluePin 11

// 초음파 센서 변수
long duration;
int distance;

// RGB LED 변수
int redValue = 255;
int greenValue = 0;
int blueValue = 0;

void setup() {
  // 핀 모드 설정
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  
  // 시리얼 통신 시작
  Serial.begin(9600);
}

void loop() {
  // 초음파 센서로 거리 측정
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.034 / 2;
  
  // 거리에 따라 LED 색상 변경
  if (distance <= 30) {
    redValue = 255;
    greenValue = 0;
    blueValue = 0;
  } else if (distance > 30 && distance <= 60) {
    redValue = 0;
    greenValue = 255;
    blueValue = 0;
  } else {
    redValue = 0;
    greenValue = 0;
    blueValue = 255;
  }
  
  // LED에 색상 적용
  analogWrite(redPin, redValue);
  analogWrite(greenPin, greenValue);
  analogWrite(bluePin, blueValue);
  
  // 시리얼 모니터에 거리 출력
  Serial.print("Distance: ");
  Serial.println(distance);
  
  // 500ms 대기
  delay(500);
}

 

준비품 : 아두이노uno R3, 초음파센서, 3색 LED, 300옴 저항 3개

아두이노 UNO
초음파 센서
3색 LED
300옴 저항
아두이노 우노 R3 초음파 센서 3색 LED 300옴 저항

 

 

다음과 같이 회로에 요소들을 연결한다

 

먼저 3색 LED의 RED를 아두이노 9번핀, GREEN을 10번핀, BLUE를 11번핀에 300옴 저항을 각각 연결하여 아두이노에 연결한다.

다음 초음파센서의 TRIG를 아두이노 2번핀에 연결하고, ECHO를 아두이노 3번핀에 연결한다.

센서의 VCC를 아두이노 +5V에 연결하고, 센서의 GNE는 아두이노 GND에 똑같이 연결한다.

그리고 3색 LED의 2번 다리를 +5V에 연결하고 USB케이블을 아두이노 포트에 연결한다.

 

 

다음 아두이노 IDE를 실행하여 다음과 같이 코딩한다.

초음파센서 거리측정

초음파 센서의 TRIG, ECHO핀을 매크로 상수로 TREG는 2로, ECHO는 3으로 선언한다.

삼색 LED의 RED를 9, GREEN은 10, BLUE은 11로 정의한다.

void setup문에서 핀모드를 TRIG는 OUTPUT로, ECHO는 INPUT로 설정한다.

다음 void loop문에서 digitalWrite(TRIG, LOW/HIGH)는 초음파센서의 TRIG에서 초음파를 발사하는 부분이다. 

long distance = pulseIn(ECHO, HIGH)/58.2; 는 pulseIn 명령어를 사용하여 ECHO에 초음파가 들어오는 시간을 계산한다. 여기서 58.2는 시간을 cm단위로 변환하여 주는 역활을 한다.

삼색 LED의 R, G, B를 모두 255로 설정하여 초기상태에서는 LED를 끄게한다.

여기서 255로 설정하는 이유는 삼색LED의 공동다리가 "+" 이기 때문이다. 만일 LED의 공동다리가 "-"이라면 R, G, B의 값을 모두 0으로 해주어야 한다.

다음 if문에서 distance < 10은 거리 10cm이하에서는 RED가 켜지고, 거리 20cm 이하에서는 GREEN을 켜며, 30cm이하에서는 BLUE가 켜진다. 여기서 analogWrite값을 0으로 정해주어야만 LED가 켜진다. 위에서 얘기한것처럼 LED의 공동핀이 "-"인 경우는 analogWrite값을 255로 정해주어야 할 것이다.

위와 같이 전부 코딩을 끝낸 후 업로드 시켜주면 초음파에 어떠한 물체가 감지되면 거리에 따른 값이 LED에 현시될 것이다.

 

출력 결과

https://www.youtube.com/watch?v=jP6X4kVFmto&t=20s

 

 

 

 

728x90
반응형
posted by 조이키트 블로그
2020. 7. 28. 10:36 아두이노 기초
728x90
반응형

준비품 : 아두이노uno, 3색 LED 1개, 300옴 저항 3개

3색 LED : 왼쪽으로부터 1번 - 빨강색, 2번 -(+단자), 3번 - 초록색, 4번 - 파랑색
아두이노 우노
300옴 저항

 

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

https://link.coupang.com/a/b2vSOT

 

ATmega328P 마이크로 컨트롤러가 있는 아두이노 우노 R3 개발 보드 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FRps

 

HC-SR04 초음파 거리 측정 모듈 - 기타측정도구 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

위와 같은 부품들이 준비되면 아래와 같이 빵판에 요소들을 연결한다.

 

LED 1번을 아두이노 11핀, 3번을 10핀, 4번을 9핀에 300옴 저항을 각각 거쳐 연결한다.

그리고 LED 2번을 아두이노 +5V핀에 연결한다.

참고 : LED 2번이 "+"인 경우

만일 LED 2번이 "-"인 경우는 아두이노 GND에 연결해야 한다.

 회로에 연결하기 전에 반드시 확인하기 바란다.

 

다음은 아두이노 IDE에  아래와 같이 코딩을 한다.

 

 

void loop()문에서 analogWrite변수는 0~255사이의 값을 지정할 수 있는데 0은 0V, 255는 +5V가 출력된다고 보면 된다.

따라서 빨간색 항목에서 red: 0는 0V 출력, green: 255는 5V 출력, blue: 255는 +5V가 출력된다.

LED의 공동단자가 +이므로 빨간색을 켜려면 red를 0V로 해주어야 하고, 나머지는 255로 해주어야 한다.

초록색도 마찬가지로 green을 0으로 해주어야 하고 파판색도 역시 blue를 0으로 해주고 나머지는 255값으로 해주어야 선택한 한가지 색만 켜질수 있다. 

그리고 delay 값을 3000으로 지정하였는데 이는 3초에 한번씩 색이 바뀜을 의미한다. 

지연시간을 늘이거나 줄이려면 이값을 임의로 변경하여 주면 된다.

 

아래에 3색 LED가 3초에 한번씩 색이 변화는 결과이다.

 

출력 결과

https://www.youtube.com/watch?v=-7bRSu0hSQc&t=8s

 

728x90
반응형
posted by 조이키트 블로그
2020. 7. 28. 10:33 아두이노 기초
728x90
반응형

먼저 컴퓨터에 아두이노IDE 프로그램을 설치한다.

아래 영상에서 아두이노IDE 다운로드 및 설치방법을 볼수 있다.

 

아두이노  IDE 다운로드 및 설치

https://www.youtube.com/watch?v=nwnVxz9ZJLQ&t=8s

설치가 끝난 다음 아두이노 IDE프로그램을 샐행하면 다음과 같은 화면이 나타난다.

아두이노 IDE 새파일

그리고 아두이노를 컴퓨터 USB포트에 연결한다.

아두이노를 PC에 연결

다음 메뉴바에서 툴(tools)/포트/COM3(Arduion uno)를 선택한다.

다른데서는 COM번호가 다를수 있음

이렇게 되면 아두이노와 컴퓨터간의 통신이 이루어진다.

준비품은 LED 한개와 300옴 저항이 필요하다. 

 

위의 그림과 같이 LED의 "+"는 아두이노 핀모드의 13번에 연결하고 "-"는 300옴 저항을 연결하여 GND핀에 연결한다.

(저항은 +/-핀 아무쪽에다 연결해도 상관없음)

그리고 아두이노 IDE의 메뉴에서 파일/예제/Basics/Blink를 선택하고 아래와 같이 코딩한다.

 

코딩 부분에서 int LED = 13: 은 LED출력을 아두이노의 13번 핀으로 선언하는 것이고,

void setup문의 pinMode는 LED 출력 부분이고, void loop문의 digitalWrite(HIGH/LOW)는 HIGH일 때 LED가 켜지고, LOW일 때 LED가 꺼진다. 

다음 delay(1000)는 LED가 켜지고 꺼지는 시간간격이다. 예를들어 1000이면 1초 간격으로 LED가 켜졌다 꺼졌다 하고 5000이면 5초마다 LED가 켜졌다 꺼진다.

코딩을 다하면 저장을 하고 업로드 시킨다.

 

출력 결과

https://www.youtube.com/watch?v=OErb-qabOsk&t=13s

 

그러면 위와 같이 LED가 1초, 3초 간격으로 깜빡이는 것을 볼 수 있다.

 

728x90
반응형
posted by 조이키트 블로그
2020. 7. 28. 10:00 아두이노 기초
728x90
반응형

1) 아두이노 소개

아두이노는 오픈 소스 하드웨어 및 소프트웨어 플랫폼으로, 전자 제품 개발 및 프로토타이핑을 위해 디자인된 간단하고 유연한 마이크로컨트롤러 보드이다.

아두이노 보드는 다양한 센서 및 액추에이터를 제어하고 외부 입력을 받아들일 수 있으며, 컴퓨터나 다른 장치와 통신할 수 있는 기능을 제공한다. 이러한 특성으로 아두이노는 전자 공학자, 예술가, 디자이너, 학생 등 다양한 사람들에게 인기가 있으며, 작은 프로젝트부터 대규모 제품 개발까지 다양한 용도로 활용된다.

 

아두이노에는 아두이노UNO, DUE, TRE, NANO 등 여러가지가 있다. 

아두이노 UNO 아두이노 DUE 아두이노 TRE 아두이노 NANO

 

납땜을 하지 않고 핀을 꼽아 연결할 수 있어 간편하다.

아두이노 UNO는 8bit 오픈소스 하드웨어이다. 

아두이노 DUE는 32bit 오픈소스 하드웨어이다.

 

2) 아두이노로 할 수 있는것

아두이노는 유선, 무선으로 인터넷 연결이 가능하며, 입출력 핀을 통하여 각종 센서들의 제어가 가능하다.

또한 스마트폰을 이용하여 집에 있는 각종 전자기기들의 제어가 가능하다.

사물인터넷IOT, 로봇, 드론, 3D프린터, CNC등의 공작기계, 자동제어 분야에서 활용이 된다.

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

https://link.coupang.com/a/b2vSOT

 

ATmega328P 마이크로 컨트롤러가 있는 아두이노 우노 R3 개발 보드 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FVQk

 

아두이노 나노 CH340 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FXO8

 

[정품] 아두이노 나노 33 BLE 블루투스 모듈 - 액세서리 | 쿠팡

쿠팡에서 5.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 1 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FYor

 

아두이노 프로 미니 ATMEGA328P 5V/16M (Arduino Pro Mini ATMEGA328P 5V/16M) - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

728x90
반응형
posted by 조이키트 블로그
2020. 7. 28. 09:48 Verilog 설계
728x90
반응형

1. 설계 구현

1) 1~4층 엘리베이터 구현한다.
(1) 각 층에서 원하는 층으로 자유롭게 이동 가능하게 한다.
(2) 층간 이동시 층은 차례대로 이동한다.
(3) 예를 들면 1층에서 4층으로 이동할 때 : f1>up2>f2>up3>f3>up4>f4
(4) 엘리베이터 탑승가능 인원은 1~9명이고, 인원 초과 시 정지 후 알람이 울린다.
(5) 긴급버튼 : 입력 시 정지한 후 알람이 울린다.
(6) 이동 중(up 혹은 down state)에는 입력이 반영되지 않는다. 단 긴급버튼(emergency)은 가능하다.
(7) 각 층 도착 시에는 문이 열리고 닫히고, 출발/정지가 가능하다.
(8) 엘리베이터 1~4층 사이의 어느 층에서도 출발 가능하고, 출발한 엘리베이터는 1~4층 사이의 어느 층이라도 갈수 있다.
2) entity 조건
(1bit input) CLK : clock 신호
(1bit input) RESET : reset 신호
(1bit input) Emergency : 긴급 상황 버튼
(1bit input) Bell : haz state에서 bell 입력 시 문을 열려있는 상태로 만들어준다.
(4bit input) in : 이동하고자 하는 층수 입력 받는다.
(5bit input) People : elevator 탑승 인원을 입력 받는다.
(3bit output) Floor : elevator가 현재 위치한 층을 알려준다.
(1bit output) Emer_s : 긴급 상황일 때 haz state로 이동하였을 때 활성화 되는 신호이다.
(1bit output) Door : 1bit, 문의 상태를 알려준다. (1 : open, 0 : close)
(1bit output) Over : 1bit, 탑승인원 초과 유무를 나타낸다.
(1bit output) Alarm : 원하는 층에 도착하였을 때와 문이 열려있을 때, Hazard state일 때 울리는 알람이다.
3) 제한 사항
(1) 한 번에 단 하나의 요청만 입력받는다.
(2) 에러가 들어오는 경우는 존재하지 않는다고 가정한다.
(3) Clock의 길이는 상간 없으나 clock의 상승 edge에 맞추어 회로가 동작한다.
(4) 입력이 없을 때에는 elevator는 대기한다. (현재 상태에 머무른다.)
(5) Elevator의 문이 열리고 닫히는 상황은 목표 층까지 가는 도중에는 따로 처리하지 않는다.
4) State Diagram

 

코딩

2. 4층 엘리베이터 Verilog 코딩
module ele4(clk, reset, in, people, bell, floor, over, door, alarm, emergency, emer_s);
input clk, reset, emergency, bell; // CLOCK, 재설정, 긴급상황버튼
input [2:0] in; // 층수 입력 변수 선언
input [3:0] people; // 탑승인원 변수 선언
output [2:0] floor; // 층수 출력변수 선언
output over, door, alarm, emer_s; // 탑승인원 초과, 문, 알람 출력 상태 변수 선언
reg over, door, alarm, emer_s;
reg [2:0] floor, state, next_state;


parameter s1=2'b01; // 1층
parameter s2=2'b10; // 2층
parameter s3=3'b011; // 3층
parameter s4=3'b100; // 4층


always @ (posedge clk or negedge reset)
if(reset) state<=s1; // 재설정시 상태는 1층
else state <=next_state; // 그외는 다음상태를 가리킴


always @ (state or in or people or emergency or bell)begin
case(state)
s1 : begin //1층
floor<=3'b001; // state가 001이면 1층 출력
over<=1'b0; // 초과인원 없으면 0 출력


if(emergency==1'b1)begin // 층수 입력이 2 or 3 or 4이고 긴급버튼 입력시 1층에 있다면
next_state<=s1; // 다음 상태도 역시 1층, 즉 1층에서 정지
alarm<=1'b1; // 정지 후 알림
emer_s<=1'b1; // 긴급상황일 때 활성화 되는 신호
end
else if(emergency==1'b0)begin // 층수 입력이 2 or 3 or 4이고 긴급버튼 입력을 하지 않았다면
alarm<=1'b0; // 알람 정지
emer_s<=1'b0; // 긴급 상황일 때 활성화 되는 신호 없음
end


if(in==3'b001)begin // 1층에 도착하면
door<=1'b1; // 문이 열리고
alarm<=1'b1; // 알람이 울림
end


if(people>4'b1001)begin // 인원 초과(9명이상)시
over<=1'b1; // 인원초과 알림
end


if(bell==1'b1)begin // 벨 입력 시
door<=1'b1; // 문 열림
end
if(in==3'b001|people>4'b1001|bell==1'b1|emergency==1'b1)begin // 층수 입력이 1이고, 탑승인원이 9명 초과시
next_state<=s1; // 다음 상태도 1층, 즉 정지
end
else if(in==3'b010|in==3'b011|in==3'b100)begin //만일 입력이 1층외라면
next_state<=s2; // 다음 상태는 2층을 가리킴
door<=1'b0; // 문이 닫기고
alarm<=1'b0; // 알람이 울리지 않음
end
end


s2 : begin // 2층
floor<=3'b010; // 2층 출력
over<=1'b0; // 초과 인원 없음


if(emergency==1'b1)begin // 긴급버튼 입력 시 2층에 있다면
next_state<=s2; // 다음 상태도 역시 2층, 즉 2층에서 정지
alarm<=1'b1; // 정지 후 알림
emer_s<=1'b1; // 긴급 상황일 때 활성화 되는 신호
end
else if(emergency==1'b0)begin // 긴급버튼 입력을 하지 않았다면
alarm<=1'b0; // 알람 정지
emer_s<=1'b0; // 긴급 상황일 때 활성화 되는 신호 없음
end


if(in==3'b010)begin // 2층에 도착하면
door<=1'b1; // 문이 열리고
alarm<=1'b1; // 알람이 울림
end


if(people>4'b1001)begin // 인원 초과(9명이상)시
over<=1'b1; // 인원초과 알림
end


if(bell==1'b1)begin // 벨 입력 시
door<=1'b1; // 문 열림
end
if(in==3'b010|people>4'b1001|bell==1'b1|emergency==1'b1)begin // 2층시 탑승인원이 초과했다면
next_state<=s2; // 2층에서 정지
end


else if(in==3'b001)begin // 2층에 있을 때 1층을 입력 했다면
next_state<=s1; // 다음 상태는 1층을 가리킴
door<=1'b0; // 문이 닫기고
alarm<=1'b0; // 알람이 울리지 않음
end
else if(in==3'b011|in==3'b100)begin // 2층에 있을 때 3층 혹은 4층을 입력했다면
next_state<=s3; // 다음 상태는 3층을 가리킴
door<=1'b0; // 문이 닫기고
alarm<=1'b0; // 알람이 울리지 않음
end
end
 
s3 : begin // 3층
floor<=3'b011; // 3층 출력
over<=1'b0; // 초과인원 없음
if(emergency==1'b1)begin // 긴급버튼 입력 시 3층에 있다면
next_state<=s2; // 다음 상태도 역시 3층, 즉 3층에서 정지
alarm<=1'b1; // 정지 후 알림
emer_s<=1'b1; // 긴급 상황일 때 활성화 되는 신호
end
else if(emergency==1'b0)begin // 3층에 있고 긴급버튼 입력을 하지 않았다면
alarm<=1'b0; // 알람 정지
emer_s<=1'b0; // 긴급 상황일 때 활성화 되는 신호 없음
end


if(people>4'b1001)begin // 인원 초과(9명이상)시
over<=1'b1; // 인원초과 알림
end
if(in==3'b011)begin // 3층에 도착하면
door<=1'b1; // 문이 열리고
alarm<=1'b1; // 알람이 울림
end


if(bell==1'b1)begin // 벨 입력 시
door<=1'b1; // 문 열림
end
if(in==3'b011|people>4'b1001|bell==1'b1|emergency==1'b1)begin // 3층에 있을 때 탑승인원(9명이상)이 초과 상태이면
next_state<=s3; // 3층에서 정지
end
else if(in==3'b010|in==3'b001)begin // 3층에 있을 때 2층 혹은 1층을 입력했다면
next_state<=s2; // 다음 상태는 2층을 알려줌
door<=1'b0; // 문이 닫기고
alarm<=1'b0; // 알람이 울리지 않음
end


else if(in==3'b100)begin // 3층에 있을 때 4층을 입력했다면
next_state<=s4; // 다음 상태는 4층을 알려줌
door<=1'b0; // 문이 닫기고
alarm<=1'b0; // 알람이 울리지 않음
end
end


s4 : begin // 4층
floor<=3'b100; // 5층 출력
over<=1'b0; // 인원초과 없음
if(emergency==1'b1)begin // 긴급버튼 입력 시 4층에 있다면
next_state<=s4; // 다음 상태도 역시 4층, 즉 4층에서 정지
door<=1'b1; // 문이 열리고
alarm<=1'b1; // 정지 후 알림
emer_s<=1'b1; // 긴급 상황일 때 활성화 되는 신호
end

else if(emergency==1'b0)begin // 층수 입력이 4이고 긴급버튼 입력을 하지 않았다면
door<=1'b0; // 문이 닫기고
alarm<=1'b0; // 알람 정지
emer_s<=1'b0; // 긴급 상황일 때 활성화 되는 신호 없음
end
if(people>4'b1001)begin // 인원 초과(9명이상)시
over<=1'b1; // 인원초과 알림
end
if(in==3'b100)begin // 4층에 도착하면
door<=1'b1; // 문이 열리고
alarm<=1'b1; // 알람이 울림
end
if(bell==1'b1)begin // 벨 입력 시
door<=1'b1; // 문 열림
end


if(in==3'b100|people>4'b1001|bell==1'b1|emergency==1'b1)begin // 4층에 있을 때 탑승인원이 초과 상태이면
next_state<=s4; // 4층에서 정지
end
else if(in==3'b011|in==3'b010|in==3'b001)begin // 입력을 3층, 2층 혹은 1층을 입력했다면
next_state<=s3; // 다음 상태는 3층을 알려줌
door<=1'b0; // 문이 닫기고
alarm<=1'b0; // 알람이 울리지 않음
end
end
endcase
end
endmodule

 

3. 4층 엘리베이터 시뮬레이션
층이동 : 1층 → 4층 → 1층 → 3층 (목적지에 도착하면 알람이 울리면서 문이 열림)

탑승인원(9명: 1001 ) 초과(10명: 1010)시 over=1 출력하고 정지, 초과 탑승자가 내리면 계속 동작

벨(bell) 입력 시 엘리베이터 문(door)이 열린 상태에서 정지, 벨을 놓으면 계속 진행

 

 

728x90
반응형
posted by 조이키트 블로그
prev 1 2 3 4 5 next