22.02.24 wemos 서보모터, 시리얼모니터 입출력, 블루투스

최고고·2022년 2월 24일
0

서보모터 실습

  • wemos servo는 ESP32_Servo를 사용함
    -자동완성할수있음 스케치-라이브러리포함하기-zip라이브러리추가-ESP32_Servo
    ※UNO는 #include<Servo.h>

  • 가변저항으로 서보모터 각도 제어하기

  • 가변저항은 센서(외부 상태 알려줌)이므로 INPUT

  • 센서로부터값을 시리얼모니터에 출력해야됨 =>잘읽힌다면 0~4095비트

  • write의 각도는 0~179도 --->범위변환 map함수 사용


#include <ESP32_Servo.h>//서보모터 라이브러리 불러와 사용
Servo myServo; // Scanner sc
int servoPin = 17;
int potPin = 34;
void setup() {
  myServo.attach(servoPin); //서보모터의 핀모드
  Serial.begin(115200);
}

void loop() {
  int sensorValue = analogRead(potPin);
  Serial.println(sensorValue);
  int mapValue = map(sensorValue,0,4095,0,179);
    돌아가는 방향 바꾸려면 가변저항의 + - 를 바꾸거나,
	0, 4095 위치를 바꾸거나 0,179의 위치를 바꾸면 +- 가 바뀐다 
  myServo.write(mapValue);

}



시리얼모니터 입 출력

시리얼모니터에 출력되는 종류
line ending 없음 : 123
새줄 : 123\n - 개행됨
CR : 123\r - 엔터치면 커서가 맨앞으로감
Both NL&CR : 123\n\r

  • Serial.available()
    시리얼 통신할 때, 데이터 수신시 사용되는함수
    아두이노에 데이터가 들어올때 시리얼 버퍼에 데이터가 저장됨
    -시리얼 버퍼(큐구조-FIFO): 탐색해서 자료가 몇개인지 검색, 개수가 리턴됨
    Serial.read를통해 데이터를 읽고 데이터 수신이 이루어짐
    자료구조 참고 : stack구조-> FILO / Queue구조->FIFO
    Serial.read()를 통해 읽어들인 값을 char, String 등으로 저장-> 읽은 값은 시리얼버퍼에서 사라짐
    char는 여러문자열을 개행해서 출력함 주의
// 1,2,3 입력시 led 제어
int ledPin1=18;
int ledPin2=19;
int ledPin3=23;

void setup() {
  Serial.begin(115200);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  
}

void loop() {
  if(Serial.available()){ 	//시리얼통신이 온다면
    //시리얼 버퍼(큐구조-FIFO) 탐색해서 자료가 몇개인지 검색 , 개수가 리턴됨
    //자료구조 참고 : stack구조-> FILO   / Queue구조->FIFO
    //C++에서는 if문에 정수가능- 0은F, 1이상 T
    char c = Serial.read(); 
    //시리얼버퍼의 맨먼저 값을 하나 꺼내서 사라지고 값이 char에 저장됨
    Serial.println(c);
    //큰if문 안 if ↓↓↓
    if(c=='1'){			//char형태라 문자열로 인식됨
      digitalWrite(ledPin1, HIGH);
    } else if(c=='2'){
      digitalWrite(ledPin2, HIGH);
    } else if(c=='3'){
      digitalWrite(ledPin3, HIGH);
    } else if(c=='0'){
      digitalWrite(ledPin1, 0);
      digitalWrite(ledPin2, 0);
      digitalWrite(ledPin3, 0);
    }
    
  }
}

시리얼모니터에 랜덤 플러스 게임 생성하기 -> 값 입력받고, 정답일때 오답일때 각 출력하기

랜덤 숫자 출력하는 함수 : random();
random(num) ; : 0 ~ num-1 랜덤숫자 생성
random(min,max); : min값 포함, max값 포함안되는 범위의 랜덤숫자 생성

int num1=0;			//루프문안에서 랜덤값 출력을 위한 전역변수
int num2=0;

void setup() {
  Serial.begin(115200);
  Serial.println("====Game Start====");
  sendQuiz(); 	//랜덤값 추출하고 정수 추출하는 메서드로 만들어줌 .. 아래서 확인,,
}

void loop() {
  //입력 받고 정답이라면 "정답입니다" 오답이라면"오답입니다" 출력

  if(Serial.available()){      //계속해서 버퍼탐색
    int input = Serial.parseInt(); 	//정수형으로 형변환이 필요한 이유:  아두이노자체에서 아스키코드로 변환해버리기 때문
    Serial.println(input);
    if(num1+num2 == input){
      Serial.println("정답입니다");
    }else {
      Serial.println("오답입니다");
    }
    sendQuiz();
  }
}

void sendQuiz() {
    num1 = random(9) + 1; //1~9 랜덤숫자 생성
    num2 = random(1,10); //min값 포함, max값 포함안됨
    Serial.print(num1);
    Serial.print("+");
    Serial.print(num2);
    Serial.print("=");
}

맞출수록 레벨이 올라가고 틀릴수록 한단계씩 내려가는 게임 만들기, 0입력시 게임 종료(cnt변수추가)

int num1 = 0;
int num2 = 0;
int cnt = 0; //정답횟수 저장하는 변수
boolean check = true;	//0입력을 위한 변수 선언

void setup() {
  Serial.begin(115200);
  Serial.println("====Game Start====");
  sendQuiz();
 
}

void loop() {
  //입력 받고 정답이라면 "정답입니다" 오답이라면"오답입니다" 출력
  //0입력시 종료
  //정답을 맞출수록 문제난이도 상승->두자리수-세자리수-...n자리수덧셈으로
  if(Serial.available()){      //계속해서 버퍼탐색
    int input = Serial.parseInt();
    Serial.println(input);
    if(input == 0){
      check = false;	//false지정하면 바로아래if문 거치지않음
      Serial.println("종료되었습니다.");
    }
    if(check){
      if(num1+num2 == input){
      Serial.println("정답입니다");
      cnt++;
      }else {
      Serial.println("오답입니다");
        if(cnt>0){
          cnt--; 	//cnt가 0이었다면 음수가 되니까 조건을 0이상으로 줌
        }
      }
      sendQuiz();
    } //------- if(check) 끝나는 부분
  }
    
}

void sendQuiz() {
    num1 = random(pow(10,cnt), pow(10, cnt+1)); 
    num2 = random(pow(10,cnt), pow(10, cnt+1)); 
    //min:10^cnt, max:10^cnt+1
    //pow(수,지수)=>거듭제곱 값이 나옴
    Serial.print(num1);
    Serial.print("+");
    Serial.print(num2);
    Serial.print("=");
}

블루투스로 아두이노 제어하기(안드로이드)

  • 블루투스 통신을 위한 라이브러리 지정하기: 블루투스 포함하기-BluetoothSerial


에서 새로 나온 창 복붙해오기

  1. 어플리케이션 실행 -블루투스 아두이노 블루투스 컨트롤러 다운받기
  2. ESP___ <= 클릭
  3. Terminal Mode
  4. line ending 없음 -> 새 줄

#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32gogo"); //블루투스검색시 모듈이름 Bluetooth device name
  Serial.println("The device started, now you can pair it with bluetooth!");
}

void loop() {
  if (Serial.available()) {
    SerialBT.write(Serial.read());
  }
  if (SerialBT.available()) {
    Serial.write(SerialBT.read());
  }
  delay(20);
}

폰기종 운영체제가 IOS라 이부분은 빠르게 넘어갔다..

  • 아두이노간 데이터 통신
    -master보드와 slave보드를 지정해 데이터 통신이 가능하다
    -master보드 예제-bluetoothSerial-SerialtoSerialBTM
    =>String name = "장치명" 과 SerialBT.begin("장치명", true)부분 동일하게 써주기
    -slave보드 예제 bluetoothSerial-SerialtoSerialBT >>slave는 기존 블루투스 예제처럼 불러와 복붙하고 검색될 장치명 이름을 master와 똑같게 맞춰줌 => SerialBT.begin("장치명")

Wifi통신으로 아두이노와 웹 연결

이클립스에서 임의의 html문서만들기 -> 실행해서 localhost부분을 나의 IPv4주소로 바꿔준다

#include <WiFi.h>
#include <HTTPClient.h>

const char* ssid = "???"; //wifi id
const char* password =  "???";   //wifi pw

String result = "";


void setup() {

  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
  }

  Serial.println("Connected to the WiFi network");

}
void loop() {

  if ((WiFi.status() == WL_CONNECTED)) { //Check the current connection status

    HTTPClient http;
    http.begin("http://192.168.137.1:8090/IoT/index.html"); 
    int httpCode = http.GET();                                        //Make the request
    if (httpCode > 0) { //Check for the returning code

      Serial.println(httpCode);
      result = http.getString();  
      Serial.println(result);     
    }
    else {
      Serial.println("Error on HTTP request");
    }

    http.end(); //Free the resources
  }
  delay(1000);
}

시리얼모니터에 wifi connected가 뜨면 와이파이 연결이 된 것! 200 에러 창이 뜨면 연결 html과 연결된 것

  • 아두이노는 요청하는 클라이언트, 서블릿은 클라이언트의 요청을 받아, 응답을 보내줄 서버 역할을 함

http.begin("http://192.168.137.1:8090/IoT/Exam00?data=1234");
쿼리스트링방식 사용해서 서블릿으로 data의 값 1234를 보냄 -> data?=1234
서블릿 예제파일을 아래처럼 만들어줌

#include <WiFi.h>
#include <HTTPClient.h>

const char* ssid = "아이디"; 
const char* password =  "비번";  

String result = "";


void setup() {

  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
  }

  Serial.println("Connected to the WiFi network");

}

void loop() {

  if ((WiFi.status() == WL_CONNECTED)) { //Check the current connection status

    HTTPClient http;
    http.begin("http://192.168.137.1:8090/IoT/Exam00?data=1234"); 
    //쿼리스트링방식 사용해서 만들어놓은 서블릿으로 data의 값 1234를 보냄 -> data?=1234 
    int httpCode = http.GET();                                        //Make the request

    if (httpCode > 0) { //Check for the returning code

      Serial.println(httpCode);
      result = http.getString();  
      Serial.println(result);     
    }
    else {
      Serial.println("Error on HTTP request");
    }

    http.end(); //Free the resources
  }
  delay(1000);
}
package test;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Exam00")
public class Exam00 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		//아두이노로 보내줄 출력스트림 out객체 생성
		String data = request.getParameter("data"); //아두이노로부터 쿼리스트링으로 받아온 data
		System.out.println(data);
		 //콘솔창에 데이터 출력
		out.print("안녕하세요 / Hello World"); //아두이노 시리얼모니터에 출력됨
		
	}

}

0개의 댓글