MeArm - 원격 제어 1

OS/Arduino 2017.10.03 02:53 Posted by 파란크리스마스

MeArm - 원격 제어 1

출처 : 실습4. 아두이노 (Arduino)로 가변저항의 저항 값 읽기 : 네이버 블로그 | 메이키스트

MeArm을 원격 제어 하기 위해서 만들기 시작했는데, 아직 하나의 아두이노에서 제어만 가능한 상태입니다.

Raspberry PI를 이용해서 제어 명령을 녹화 했다가 다시 재생하고, 블루투스로 원역으로 제어 하는 부분을 구현 예정인데, 완료되면 다시 글 올리도록 하겠습니다.

최초 아두이노 소스

#include<Servo.h> 

Servo myservo1; 
Servo myservo2;
Servo myservo3; 
int servoPin1 = 10; 
int servoPin2 = 3; 
int servoPin3 = 5; 
int pos = 0; 

int analogPin1 = A1;     // potentiometer wiper (middle terminal) connected to analog pin 3
int analogPin2 = A2;
int analogPin3 = A3; // outside leads to ground and +5V
int val1 = 0;           // variable to store the value read
int val1_offset_p = 10;
int val1_p_max = 180;
int val1_offset_s = 0;
int val1_ratio = 5.6266;
long temp1_old = 0;
int val2 = 0;           // variable to store the value read
int val2_offset_p = 90;
int val2_p_max = 170;
int val2_offset_s = 60;
int val2_ratio = 6.3636;
long temp2_old = 0;
int val3 = 0;           // variable to store the value read
int val3_offset_p = 100;
int val3_p_max = 180;
int val3_offset_s = 30;
int val3_ratio = 6;
long temp3_old = 0;

void setup()
{
  Serial.begin(9600);          //  setup serial
  myservo1.attach(servoPin1); 
  myservo2.attach(servoPin2); 
  myservo3.attach(servoPin3); 
}

void loop()
{
  val1 = analogRead(analogPin1);    // read the input pin
  val2 = analogRead(analogPin2);    // read the input pin
  val3 = analogRead(analogPin3);    // read the input pin
  Serial.print(val1);             // debug value
  Serial.print(", ");             // debug value
  Serial.print(val2);             // debug value
  Serial.print(", ");             // debug value
  Serial.print(val3);             // debug value
  

  // 오른쪽 0 / 왼쪽 180
  // 오른쪽 1023 / 왼쪽 10
  // 1023-10 / 180 = 5.6266
  long temp1 = val1_p_max + val1_offset_s - ((val1 - val1_offset_p) / val1_ratio);
  if (temp1 < val1_offset_s) {
    temp1 = val1_offset_s;
  }
  if (temp1 > val1_p_max) {
    temp1 = val1_p_max;
  }
  Serial.print(", ");             // debug value
  Serial.print(temp1_old);             // debug value

  // 뒤 170 / 앞 : 60
  // 뒤 90 / 왼쪽 790
  // 790-90 / 170-60 = 6.3636  
  long temp2 = val2_p_max - ((val2 - val2_offset_p) / val2_ratio);
  if (temp2 < val2_offset_s) {
    temp2 = val2_offset_s;
  }
  if (temp2 > val2_p_max) {
    temp2 = val2_p_max;
  }

  
  Serial.print(", ");             // debug value
  Serial.print(temp2_old);             // debug value

  
  
  // 뒤 30 / 앞 : 180
  // 뒤 1000 / 앞 100
  // 1000-100 / 180-30 = 6 
  long temp3 = val3_p_max - ((val3 - val3_offset_p) / val3_ratio);
  if (temp3 < val3_offset_s) {
    temp3 = val3_offset_s;
  }
  if (temp3 > val3_p_max) {
    temp3 = val3_p_max;
  }

  Serial.print(", ");             // debug value
  Serial.print(temp3_old);             // debug value

  if (temp1_old - 25 < temp1  &&  temp1_old + 25 ) {
    myservo1.write(temp1); 
    temp1_old = temp1;  
  }

  if (temp2_old - 25 < temp2  &&  temp2_old + 25 ) {
    myservo2.write(temp2); 
    temp2_old = temp2;  
  }

  if (temp3_old - 25 < temp3  &&  temp3_old + 25 ) {
    myservo3.write(temp3); 
    temp3_old = temp3;  
  }
  
  Serial.print("\n");             // debug value
  delay(25);
}

개선된 소스 - 첫 번째

#include<Servo.h> 

Servo myservo[3];  
int servoPin[] = { 10, 3, 5 }; 

#define ARRAY_LENGTH 3
#define val1_offset_s 0
#define val1_p_max 1
#define val1_offset_p 2
#define val1_ratio 3

int analogPin[] = { A1, A2, A3 }; // outside leads to ground and +5V
double val1_offset[3][4] = {
  { 10, 180, 0, 5.6266 }, 
  { 90, 170, 60, 6.3636},
  { 100, 180, 30, 6} 
};
int val[3];           // variable to store the value read
double temp[] = { 0, 0, 0 };
double temp_old[] = { 0, 0, 0 };
int chcek_int = 3;

void setup() {
  Serial.begin(9600);          //  setup serial
  for (int i=0; i<ARRAY_LENGTH; i++) {
    myservo[i].attach(servoPin[i]);
  }
  //myservo[0].attach(servoPin[0]);
}

void loop() {
  for (int i=0; i<ARRAY_LENGTH; i++) {
    val[i] = analogRead(analogPin[i]);    // read the input pin
    Serial.print(i);
    Serial.print("=");
    Serial.print(val[i]);             // debug value
    Serial.print(",");             // debug value
  }
  Serial.print("|");             // debug value

  // 오른쪽 0 / 왼쪽 180
  // 오른쪽 1023 / 왼쪽 10
  // 1023-10 / 180 = 5.6266
  temp[0] = val1_offset[0][val1_p_max] + val1_offset[0][val1_offset_s] - ((val[0] - val1_offset[0][val1_offset_p]) / val1_offset[0][val1_ratio]);
  
  // 뒤 170 / 앞 : 60
  // 뒤 90 / 왼쪽 790
  // 790-90 / 170-60 = 6.3636 
  temp[1] = val1_offset[1][val1_p_max] - ((val[1] - val1_offset[1][val1_offset_p]) / val1_offset[1][val1_ratio]);
   
  // 뒤 30 / 앞 : 180
  // 뒤 1000 / 앞 100
  // 1000-100 / 180-30 = 6
  temp[2] = val1_offset[2][val1_p_max] - ((val[2] - val1_offset[2][val1_offset_p]) / val1_offset[2][val1_ratio]);

  for (int i=0; i<ARRAY_LENGTH; i++) {
    if (temp[i] < val1_offset[i][val1_offset_s]) {
      temp[i] = val1_offset[i][val1_offset_s];
    }
    if (temp[i] > val1_offset[i][val1_p_max]) {
      temp[i] = val1_offset[i][val1_p_max];
    }
    
    Serial.print(temp_old[i]);             // debug value
    Serial.print("/ ");             // debug value
  }
  
  for (int i=0; i<ARRAY_LENGTH; i++) {
    if (temp_old[i] - chcek_int > temp[i] || temp[i] > temp_old[i] + chcek_int ) {
      myservo[i].write(temp[i]); 
      temp_old[i] = temp[i];  
      Serial.print(", ");             // debug value
      Serial.print("servo");
      Serial.print(i);
      Serial.print(" set");             // debug value
    }
  }
  
  Serial.print("\n");             // debug value
  delay(25);
}

개선된 소스 - 두 번째

#include<Servo.h> 

Servo myservo[3];  
int servoPin[] = { 10, 3, 5 }; 

#define ARRAY_LENGTH 3
#define resi_s 0
#define resi_e 1
#define servo_s 2
#define servo_e 3
#define arm_ratio 4

int analogPin[] = { A1, A2, A3 }; // outside leads to ground and +5V
double cvalue[3][5] = {
  {  50, 1023,   0, 180, 5.6266 }, 
  {  90,  790,  60, 170, 6.3636 },
  { 100, 1000,  30, 180, 6 } 
};
int val[3];           // variable to store the value read
double temp[] = { 0, 0, 0 };
double temp_old[] = { 0, 0, 0 };
int chcek_int = 3;

void setup() {
  Serial.begin(9600);          //  setup serial
  for (int i=0; i<ARRAY_LENGTH; i++) {
    myservo[i].attach(servoPin[i]);

    // 790-90 / 170-60 = 6.3636 
    cvalue[i][arm_ratio] = (cvalue[i][resi_e] - cvalue[i][resi_s])
      / (cvalue[i][servo_e] - cvalue[i][servo_s]); 
  }
}

void loop() {
  for (int i=0; i<ARRAY_LENGTH; i++) {
    val[i] = analogRead(analogPin[i]);    // read the input pin
    Serial.print(i);
    Serial.print("=");
    Serial.print(val[i]);             // debug value
    Serial.print(",");             // debug value
  }
  Serial.print("|");             // debug value

  // 오른쪽 0 / 왼쪽 180
  // 오른쪽 1023 / 왼쪽 10
  // 1023-10 / 180 = 5.6266
  temp[0] = cvalue[0][servo_e] + cvalue[0][servo_s] - ((val[0] - cvalue[0][resi_s]) / cvalue[0][arm_ratio]);
  
  // 뒤 170 / 앞 : 60
  // 뒤 90 / 왼쪽 790
  // 790-90 / 170-60 = 6.3636 
  temp[1] = cvalue[1][servo_e] - ((val[1] - cvalue[1][resi_s]) / cvalue[1][arm_ratio]);
   
  // 뒤 30 / 앞 : 180
  // 뒤 1000 / 앞 100
  // 1000-100 / 180-30 = 6
  temp[2] = cvalue[2][servo_e] - ((val[2] - cvalue[2][servo_s]) / cvalue[2][arm_ratio]);

  for (int i=0; i<ARRAY_LENGTH; i++) {
    if (temp[i] < cvalue[i][servo_s]) {
      temp[i] = cvalue[i][servo_s];
    }
    if (temp[i] > cvalue[i][servo_e]) {
      temp[i] = cvalue[i][servo_e];
    }
    
    Serial.print(temp_old[i]);             // debug value
    Serial.print("/ ");             // debug value
  }
  
  for (int i=0; i<ARRAY_LENGTH; i++) {
    if (temp_old[i] - chcek_int > temp[i] || temp[i] > temp_old[i] + chcek_int ) {
      myservo[i].write(temp[i]); 
      temp_old[i] = temp[i];  
    }
  }
  
  Serial.print("\n");             // debug value
  delay(25);
}

실행

저작자 표시
신고

Arduino - 버저, 피에조 스피커(Piezo Buzzer)

OS/Arduino 2017.09.16 18:30 Posted by 파란크리스마스

출처 : All I want to do is BEEP! to show that the program - Arduino Forum
버저, 피에조 스피커로 음악 연주 (슈퍼마리오 배경음악) | Hard Copy Arduino

Arduino - 버저, 피에조 스피커(Piezo Buzzer)

Spec.

전압 : 5V
직경 : 12mm
핀길이 : 6.5mm
높이 : 8.5mm

배선

BEEP음 출력 소스

#define SPKR 2 //this is the digital pin that you plugged the red       wire into

void setup()
{
   pinMode(SPKR, OUTPUT); //set the speaker as output
}

void loop() //do this over and over
{
   digitalWrite(SPKR, HIGH); //turn the speaker on
   delay(500);                     //wait for half a second
   digitalWrite(SPKR, LOW); //turn the speaker off
   delay(500);                    //wait for half a second
}

피에조 스피커로 음악 연주 (슈퍼마리오 배경음악)

출처 : 버저, 피에조 스피커로 음악 연주 (슈퍼마리오 배경음악) | Hard Copy Arduino

pitches.h(링크) 파일은 아두이노 사이트에서 받을 수 있습니다.

#include "pitches.h"
 
#define melodyPin 2
 
unsigned long prevPlayTime = 0;
unsigned long playDuration = 0;
int currentMelody = 0;
 
//Mario main theme melody
int melodySize = 55;
int melody[] = {
  NOTE_E7, NOTE_E7, 0, NOTE_E7, 0, NOTE_C7, NOTE_E7, 0, NOTE_G7, 0, 0,  0, NOTE_G6, 0, 0, 0, 
  NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0, 
  NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7, 0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0,NOTE_C7, NOTE_D7, NOTE_B6, 0, 0,
  NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0, 
  NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7, 0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0,NOTE_C7, NOTE_D7, NOTE_B6, 0, 0
};

//Mario main them tempo
int tempo[] = {
  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 
  9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
  9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
};

void sing() {
    if(millis() < prevPlayTime + playDuration) {
        // music is playing. do nothing
        return;
    }
    // stop the tone playing:
    noTone(8);
    
    if(currentMelody >= melodySize)
        currentMelody = 0;
    // to calculate the note duration, take one second
    // divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 1000/tempo[currentMelody];
 
    tone(melodyPin, melody[currentMelody], noteDuration);
    prevPlayTime = millis();
    playDuration = noteDuration * 1.30;
    
    currentMelody++;
}

void setup() {
  pinMode(melodyPin, OUTPUT);
}

void loop() {
  // play music
  sing();
}


저작자 표시
신고

Arduino - 서브모터(SG-90)

OS/Arduino 2017.09.16 03:35 Posted by 파란크리스마스

출처 : 5 pcs Flame Sensor Module Fire Detection Module Infrared Receiver Module For DIY Electronic Car Wavelength 760nm-1100nm - Aliexpress.com

Arduino - 서브모터(SG-90)

설명

크기 : 21.5mm X 11.8mm X 22.7mm
무게 : 9g
속도 : 0.12 초 / 60도 (4.8V)
1.2 스톨 토크 - 1.4 kg / cm (4.8V)
작동 온도 : -30도에서 +60도
작동 전압 : 4.8V-6V

인터페이스 설명 (선)

다크 그레이 : GND
레드 : VCC의 4.8-7.2V
오렌지 라인 : 펄스 입력

배선

서브모터(SG-90) 제어 소스

#include <Servo.h>

Servo servo;

int servoPin = 9;
int angle = 0; // servo position in degrees 

void setup()  { 
  servo.attach(servoPin);
} 

void loop() { 
  for(angle = 0; angle < 180; angle++)  { 
    servo.write(angle); 
    delay(15); 
  } 
}

서브모터(SG-90) 제어 실행


저작자 표시
신고

Arduino - 불꽃 감지 센서 (SZH-EK086, 파장 760nm-1100nm)

OS/Arduino 2017.09.16 01:31 Posted by 파란크리스마스

출처 : 5 pcs Flame Sensor Module Fire Detection Module Infrared Receiver Module For DIY Electronic Car Wavelength 760nm-1100nm - Aliexpress.com

Arduino - 불꽃 감지 센서

소개

이 민감한 불꽃, 동안 또한 감지 일반적인. 보통 사용 화재 경보. , 디지털 출력 인터페이스 직접 연결된 마이크로 IO. 멀리서 유지 불꽃, 높은 온도 손상 센서 모듈. 

설명

1. 검출 불꽃 또는 광원 의 파장 범위 760nm ~ 1100nm
2. 감지 각도 약 60도, 불꽃 스펙트럼 측정
3. 정확도 조정
4. 작동 전압 3.3V 또는 5V 
5. 출력 - 아날로그 전압 출력, 디지털 스위치 출력 (0 1)
6. PCB 크기: 3cm * 1.6cm
7. Chip LM393

인터페이스 설명 (선)

1. VCC -- 3.3 볼트 5 볼트 전압
2. GND -- GND
3. DO -- 보드 디지털 출력 인터페이스 (0 1)
4. AO -- 보드 아날로그 출력 인터페이스

배선

불꽃 감지 센서 측정 소스

int ledPin = 2;
int inputPin = A0;
int val = 0;    //센서출력값 저장 변수

void setup() {
  pinMode(ledPin, OUTPUT);   //LED 출력설정
  pinMode(inputPin, INPUT);    //불꽃센서 입력설정
  Serial.begin(9600);     //시리얼모니터 설정
}

void loop() {
  val = analogRead(inputPin);  //불꽃센서에서 값을 읽어옴
  Serial.println(val);     //불꽃센서 입력값 시리얼모니터로 출력
  if(val < 150)           //불꽃센서 입력값이 150이하이면 LED실행, 환경에 따라 적절한 값으로 조절필요
  {
    digitalWrite(ledPin,HIGH);  // LED 켜기
  }else{
    digitalWrite(ledPin,LOW);   // LED 끄기
  }
  delay(500);
}
저작자 표시
신고

Arduino - 온습도센서(DHT-11)

OS/Arduino 2017.09.13 00:49 Posted by 파란크리스마스

출처 : 1PCS DHT11 DHT 11 Digital Temperature and Humidity Temperature sensor with Cable for Arduino-in Integrated Circuits from Electronic Components & Supplies on Aliexpress.com

Arduino - 온습도센서(DHT-11)

사양

습도 측정 범위 : 20 % ~ 90 % RH
습도 측정 오차 : 5 % RH ±
측정 온도 범위 : 0 ~ 60 ° C
온도 측정 오차 : ± 2 ° C
작동 전압 : DC 5V
크기 : 약. 30x13x8mm (L *의 W의 * H)

온습도센서 라이브러리 추가

온습도센서 라이브러리 다운로드

라이브러리 다운로드

다운로드 받은 라이브러리 추가

소스에 라이브러리 추가

편집창에 추가된 라이브러리 확인

배선

온습도센서(DHT-11) 측정 소스

#include <dht11.h>

int DHT11PIN = A0;            //Signal 이 연결된 아두이노의 핀번호

dht11 DHT11;
 
void setup()
{
  Serial.begin(9600);  //시리얼 통신속도 설정
}
 
void loop()
{
  int chk = DHT11.read(DHT11PIN);
 
  Serial.print("Temp: ");
  Serial.print((float)DHT11.temperature);
  Serial.print(" C ");
  
  Serial.print("/ RelF: ");
  Serial.print((float)DHT11.humidity);
  Serial.print(" %");

  Serial.println();
  
  delay(2000);
}

실행결과 (시리얼 모니터)

저작자 표시
신고

Arduino - LED 켜기

OS/Arduino 2017.09.13 00:49 Posted by 파란크리스마스

출처 : LED 한 개, 깜박이기 - 코코아팹

LED 모듈

배선

온습도센서(DHT-11) 측정 소스

int PIN_LED = 2;

void setup() {
  // 디지털 2번핀을 출력 핀으로 설정합니다. 
  pinMode(PIN_LED, OUTPUT);   
}

// setup() 함수가 호출된 이후, loop() 함수가 호출되며,
// 블록 안의 코드를 무한히 반복 실행합니다.
void loop() {
  digitalWrite(PIN_LED, HIGH);       // LED를 ON 합니다.
  delay(1000);                       // 1초간 대기합니다.
  digitalWrite(PIN_LED, LOW);        // LED를 OFF 합니다.
  delay(1000);                       // 1초간 대기합니다.
}


저작자 표시
신고

BPI - Webduino 소개

OS/Arduino 2017.08.25 15:36 Posted by 파란크리스마스

출처 : Webduino Smart Wi-Fi Setup
Aliexpress.com : Buy New Arrivals BPI Webduino smart IOT module development board from Reliable board case suppliers on SinoVoip Co.,Limited Banana PI

BPI-Webduino

BananaPI를 만든 곳에서 Iot용 모듈을 새로 만들었는데, 
이름에서 보는것과 같이 아두이노와 웹을 합쳐 놓은것 같습니다.

광센서와 REG LED가 기본 내장되어 있고, 내장된 Wifi는 AP모드와 공유기 접속하도록 두개가 지원되고,
AP모드로 접속해서 공유기에 접속 가능한 정보만 설정하면 외부에서 restful api 호출로 Webduino를 제어 할 수 있습니다.

개발언어는 Blockly 라는 도구로 웹브라우져로 개발이 가능하고,
기존 아두이노처럼 PC에 USB로 연결해서 아두이노 IDE로 업로드하는 방식은 지원하지 않고,
소스는 JavaScript로 만들어져서 restful 호출로 제어가 가능하므로, 다양한 기기에서 호출이 가능합니다.

 

BPI-Webduino와 Arduino Pro Micro 크기 비교

BPI-Webduino 핀 배열

Webduion AP 모드에 접속

Wifi목록에서 Smart 선택

암호 입력 (초기 암호 123456678)

192.168.4.1 주소를 브라우져 접속하여 공유기 접속 정보와 AP 모드 정보 수정

저장하면 수정된 정보 확인

수정된 AP 이름과 공유기에 접속된 IP학인

AP이름 뒤에 _ 이후로 공유기에 접속된 IP

Blockly RGBLED 예제 작성

Blockly RGB LED 예제 JavaScript 소스

RGB LED 예제 소스

Blockly로 작성된 소스를 Html 페이지에 2개의 버튼을 두고 색을 바꾸도록 작성해보았습니다.

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  <title>Webduino Blockly App</title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  <script src="https://webduino.io/components/webduino-js/dist/webduino-all.min.js"></script>
  <script src="https://blockly.webduino.io/webduino-blockly.js"></script>
  <script src="https://blockly.webduino.io/lib/firebase.js"></script>
  <script src="https://blockly.webduino.io/lib/runtime.min.js"></script>
  <script>
  	function rgb_call(color) {
  		var rgbled;

			boardReady({board: 'bluexmas', url: '192.168.0.62'}, function (board) {
			  board.systemReset();
			  board.samplingInterval = 250;
			  rgbled = getRGBLedCathode(board, 15, 12, 13);
			  rgbled.setColor(color);
			});
  	}
  </script>
</head>

<body>
  <div><button onclick="javascript:rgb_call('#0000ff');">blue button</span></div>
  <div><button onclick="javascript:rgb_call('#ff0000');">red button</span></div>
</body>

RGB LED 예제 실행


저작자 표시
신고

Arduino Uno - L298N & HC-06

OS/Arduino 2017.08.07 00:59 Posted by 파란크리스마스

출처 : [아두이노] 블루투스 모듈(HC-06) 사용하기 (설정, 문자열 전송, LED ON/OFF)

Arduino Uno - L298N & HC-06

#include <SoftwareSerial.h> //시리얼 통신 라이브러리 호출

int blueTx=3;   //Tx (보내는핀 설정)
int blueRx=2;   //Rx (받는핀 설정)

SoftwareSerial btSerial(blueTx, blueRx);  //시리얼 통신을 위한 객체선언
String myString=""; //받는 문자열

//모터드라이버핀과 아두이노의 연결번호
#define EA A0
#define EB A1
#define M_IN1 7
#define M_IN2 6
#define M_IN3 5
#define M_IN4 4

int motorA_vector = 1;//모터의 회전방향이 반대일시 0을 1로 1을 0으로 바꿔주시면 모터의 회전방향이 바뀝니다.
int motorB_vector = 1;//모터의 회전방향이 반대일시 0을 1로 1을 0으로 바꿔주시면 모터의 회전방향이 바뀝니다.

int motor_speed = 255;//모터 스피드     

const int DELAY = 1000;

void setup() {
  Serial.begin(9600);   //시리얼모니터 
  btSerial.begin(9600); //블루투스 시리얼 개방
  
  //모터관련 핀들을 출력으로 설정한다.
  pinMode(EA, OUTPUT);
  pinMode(EB, OUTPUT);
  pinMode(M_IN1, OUTPUT);
  pinMode(M_IN2, OUTPUT);
  pinMode(M_IN3, OUTPUT);
  pinMode(M_IN4, OUTPUT);

  //
  delay(3000);//3초 지연
  motorstop();
}

void loop()
{
  // selfTest();
  while(btSerial.available())  //mySerial에 전송된 값이 있으면
  {
    char myChar = (char)btSerial.read();  //mySerial int 값을 char 형식으로 변환
    myString+=myChar;   //수신되는 문자를 myString에 모두 붙임 (1바이트씩 전송되는 것을 연결)
    delay(5);           //수신 문자열 끊김 방지
  }
  if(!myString.equals(""))  //myString 값이 있다면
  {
    Serial.println("input value: "+myString); //시리얼모니터에 myString값 출력

    if (myString.equals("S")) {
      motorstop();
    } else if (myString.equals("F")) {
      forward();
    } else if (myString.equals("B")) {
      backward();
    } else if (myString.equals("L")) {
      left();
    } else if (myString.equals("R")) {
      right();
    }
    myString="";  //myString 변수값 초기화
  }
}

void selfTest()
{
   motor_con(motor_speed, motor_speed); //전진 
   //motor_con(-motor_speed, motor_speed); //좌회전
   //motor_con(motor_speed, -motor_speed); //우회전
   //motor_con(-motor_speed, -motor_speed); //후전
   delay(DELAY);
   motor_con(0, 0); //정지
   delay(DELAY);
}

void selfTest2()
{
  forward();
  delay(DELAY);
  motorstop(); delay(500);
  
  backward();
  delay(DELAY);
  motorstop(); delay(500);
  
  right();
  delay(DELAY);
  motorstop(); delay(500);
  
  left();
  delay(DELAY);
  motorstop(); delay(500);  
}

void motorstop()
{
  motor_con(0, 0); //정지
}

void backward()
{
  motor_con(-motor_speed, -motor_speed); //후전
}

void forward()
{
  motor_con(motor_speed, motor_speed); //전진 
}

// Let right motor keep running, but stop left motor
void right()
{
  motor_con(motor_speed, -motor_speed); //우회전
}

// Let left motor keep running, but stop right motor
void left()
{
  motor_con(-motor_speed, motor_speed); //좌회전
}

void motor_con(int M1, int M2){
 
 if(M1>0){  //모터A 정회전
   digitalWrite(M_IN1,motorA_vector);
   digitalWrite(M_IN2,!motorA_vector);
 }
 else if(M1<0){  //모터A 역회전
   digitalWrite(M_IN1,!motorA_vector);
   digitalWrite(M_IN2,motorA_vector);
 }
 else{        //모터 A 정지
   digitalWrite(M_IN1,LOW);
   digitalWrite(M_IN2,LOW);
 }
 
 if(M2>0){    //모터B 정회전
   digitalWrite(M_IN3,motorB_vector);
   digitalWrite(M_IN4,!motorB_vector);
 }
 else if(M2<0){  //모터B 역회전
   digitalWrite(M_IN3,!motorB_vector);
   digitalWrite(M_IN4,motorB_vector);
 }
 else{          //모터 B 정지
   digitalWrite(M_IN3,LOW);
   digitalWrite(M_IN4,LOW);
 }
 analogWrite(EA,abs(M1)); //A모터 속도값
 analogWrite(EB,abs(M2)); //B모터 속도값
}
저작자 표시
신고

Arduino Pro Mini

OS/Arduino 2017.08.06 01:42 Posted by 파란크리스마스

출처 : 라즈베리파이 USB to TTL Serial Cable 연결 :: tibyte.kr - 티바이트

Arduino Pro Mini - 시리얼 케이블 연결

흰색 선(RXD)을 라즈베리파이의 TXD핀에 연결하고,
초록 선(TXD)을 라즈베리파이의 RXD핀에 연결한다.

업로드

Arduino Pro Mini의 경우 리셋을 수동으로 해야 되므로, 컴파일전에 [리셋]버튼을 누리고 있다가, [업로드...]라고 나올때 [리셋]버튼을 때준다.

L298N 모터드라이버 제어

//모터드라이버핀과 아두이노의 연결번호
#define EA 2
#define EB 7
#define M_IN1 3
#define M_IN2 4
#define M_IN3 5
#define M_IN4 6

int motorA_vector = 1;//모터의 회전방향이 반대일시 0을 1로 1을 0으로 바꿔주시면 모터의 회전방향이 바뀝니다.
int motorB_vector = 1;//모터의 회전방향이 반대일시 0을 1로 1을 0으로 바꿔주시면 모터의 회전방향이 바뀝니다.

int motor_speed = 150; // 255;//모터 스피드     

const int DELAY = 1000;

void setup() {
  Serial.begin(9600);   //시리얼모니터 
  
  //모터관련 핀들을 출력으로 설정한다.
  pinMode(EA, OUTPUT);
  pinMode(EB, OUTPUT);
  pinMode(M_IN1, OUTPUT);
  pinMode(M_IN2, OUTPUT);
  pinMode(M_IN3, OUTPUT);
  pinMode(M_IN4, OUTPUT);

  //
  delay(3000);//3초 지연
  motorstop();
}

void loop() {
  selfTest();
}

void selfTest()
{
   motor_con(motor_speed, motor_speed); //전진 
   //motor_con(-motor_speed, motor_speed); //좌회전
   //motor_con(motor_speed, -motor_speed); //우회전
   //motor_con(-motor_speed, -motor_speed); //후전
   delay(DELAY);
   motor_con(0, 0); //정지
   delay(DELAY);
}

void motorstop()
{
  motor_con(0, 0); //정지
}

void motor_con(int M1, int M2){
 
 if(M1>0){  //모터A 정회전
   digitalWrite(M_IN1,motorA_vector);
   digitalWrite(M_IN2,!motorA_vector);
 }
 else if(M1<0){  //모터A 역회전
   digitalWrite(M_IN1,!motorA_vector);
   digitalWrite(M_IN2,motorA_vector);
 }
 else{        //모터 A 정지
   digitalWrite(M_IN1,LOW);
   digitalWrite(M_IN2,LOW);
 }
 
 if(M2>0){    //모터B 정회전
   digitalWrite(M_IN3,motorB_vector);
   digitalWrite(M_IN4,!motorB_vector);
 }
 else if(M2<0){  //모터B 역회전
   digitalWrite(M_IN3,!motorB_vector);
   digitalWrite(M_IN4,motorB_vector);
 }
 else{          //모터 B 정지
   digitalWrite(M_IN3,LOW);
   digitalWrite(M_IN4,LOW);
 }
 analogWrite(EA,abs(M1)); //A모터 속도값
 analogWrite(EB,abs(M2)); //B모터 속도값
}
저작자 표시
신고

Arduino - 블루투스 모듈(HC-06)

OS/Arduino 2017.02.17 22:11 Posted by 파란크리스마스

블루투스 모듈(HC-06)

출처 : [아두이노] 블루투스 모듈(HC-06) 사용하기 (설정, 문자열 전송, LED ON/OFF) - 대네브

코드

#include <SoftwareSerial.h> //시리얼 통신 라이브러리 호출
 
int blueTx=2;   //Tx (보내는핀 설정)
int blueRx=3;   //Rx (받는핀 설정)
SoftwareSerial btSerial(blueTx, blueRx);  //시리얼 통신을 위한 객체선언
String myString=""; //받는 문자열
 
void setup() {
  Serial.begin(9600);   //시리얼모니터 
  btSerial.begin(9600); //블루투스 시리얼 개방
}
 
void loop() {
  while(btSerial.available())  //mySerial에 전송된 값이 있으면
  {
    char myChar = (char)btSerial.read();  //mySerial int 값을 char 형식으로 변환
    myString+=myChar;   //수신되는 문자를 myString에 모두 붙임 (1바이트씩 전송되는 것을 연결)
    delay(5);           //수신 문자열 끊김 방지
  }
  if(!myString.equals(""))  //myString 값이 있다면
  {
    Serial.println("input value: "+myString); //시리얼모니터에 myString값 출력
    myString="";  //myString 변수값 초기화
  }
}

앱 인벤터 - 블루투스 앱 만들기

출처 : 앱 인벤터 - 블루투스 앱 만들기

MIT App Inventor 2 사이트

화면구성

블럭

저작자 표시
신고

Arduino - 가스탐지(MQ-2)

OS/Arduino 2017.02.17 02:25 Posted by 파란크리스마스

가스탐지(MQ-2)

출처 : [아두이노] MQ-2 센서를 이용한 가스탐지 및 알람 - 대네브

사양

  • 출력값 0~1023
  • 작동전압 3.3v or 5v

코드

const int gasPin = A2; //가스센서 아웃을 아두이노 A2로 설정

void setup() {
  Serial.begin(9600); //시리얼포트 설정
}
 
void loop() {
  Serial.println(analogRead(gasPin)); //센서값을 시리얼모니터로 전송
  /*
  if (analogRead(gasPin) > 400) {   // 가스 검출 시(자신의 센서 감도에 알맞게 조절필요)
    tone(12,2000,1000); // 피에조 ON (주파수 2000으로 1초간 울리기)  
  }
  */ 
  delay(1000);
}
저작자 표시
신고

Arduino - 불꽃센서(SEN040129)

OS/Arduino 2017.02.17 02:14 Posted by 파란크리스마스

불꽃센서(SEN040129)

출처 : 아두이노 불꽃센서 모듈 / Arduino Flame Sensor - 메카솔루션

사양

감지 파장 760-1100nm
각도 60도
탐지거리 30-880mm
작동전압 3.3v or 5v

배선

OUT - A1
VCC - 5V
GND - GND

코드

void setup() {
  Serial.begin(9600);
}

void loop() {
  int val;
  val=analogRead(1);
  Serial.println(val,DEC);
  delay(100);
}


저작자 표시
신고


 

티스토리 툴바