# data[].attributes.body
han.gl/jAhAD
microbit.org
github.com
arduino.cc
drive.google.com
mtinet.github.io/tttkkk
daum.net/index.html
github.com/mtinet/teachableMachineProject
https://www.python.org/
https://opentutorials.org/
https://seomal.org/
https://www.w3schools.com/
https://www.learnmore.co.kr/
https://html5up.net/
https://mtinet.github.io/tttkkk/
file:///C:/Users/User/Downloads/html5up-parallelism/index.html
python -m http.server 8080
localhost:8080

github.com/mtinet/aicar
metamask

han.gl/XMVGp
https://www.remove.bg/ko

# data[].attributes.attachment_link.title
빠른 결과물 보기(한글)

# data[].attributes.body
https://drive.google.com/drive/folders/1aRgwXoAKplVUTh2F_YDQu5cyjXQyel8l

# data[].attributes.attachment_link.title
빠른 결과물 보기(한글)

# data[].attributes.body
/*
*  - 통신 :
아두이노 MEGA - 블루투스 모듈(HC-06 or HM-10)
RX31 - TXD
TX31 - RXD

- 조향 :
아두이노 UNO - 모터 드라이버(점퍼는 사진 확인 후 적용)
p10 - enA
p11 - PUL(펄스)
p12 - DIR(디렉션)
모터 드라이버 - 스텝모터(2번, 5번 미사용)
A+ - 모터 결선 좌측 1번째
A- - 모터 결선 좌측 3번째
B+ - 모터 결선 좌측 4번째
B- - 모터 결선 좌측 6번째
모터 드라이버의 점퍼를 조정해 전류를 제어할 수 있음
모터는 K6G50C 1:50 기어박스가 포함되어 있음
점퍼는 off-on-off(200pulse/rev)로 세팅합니다.
- 페달모드 :
아두이노 - 페달
A0 - 노랑
p7  - 스위치-전진
p6  - 스위치-후진
- 구동 :
아두이노 MEGA - 모터 드라이버
전진후진(P8) - dir입력(모터 회전 방향)
PWM출력(p9) - PWM입력(파워)
*/

// 소프트웨어 시리얼은 아두이노 우노를 사용할 때는 아래 두 줄을 주석해제 합니다.
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(2, 3); // RX, TX

// 스텝 모터 제어
const int enA = 10;  // 구동 여부 결정
const int stepPin = 11; // 스텝 펄스
const int dirPinLR = 12;  // 좌우 회전
const int rst = 5; // 리셋, LOW 상태로 유지함

const int STEPS_PER_REV = 400; // 모터 2회전, 점퍼는 off-on-off로 세팅함(200pulse/rev)
int rotatePos = 10;
int rotateMid = 10;
int rotateLeftLimit = 0;
int rotateRightLimit = 20;

// 드라이브 모터 제어
const int DIR = 8; // 파워
const int PWM = 9; // 신호 1

int valocity = 100;

// 페달 제어_전진, 후진 스위치 센싱
int pedalF = 6;
boolean pedalFVal = 0;

int pedalB = 7;
boolean pedalBVal = 0;

const int ground = 4;

// 페달 제어_페달 센싱
const int pedalSensor = A0;
int pedalVal = 0;

// 수동 모드, 앱 제어모드 변경, 0은 앱제어모드, 1은 수동 모드
boolean modeState = 1;

// 속도값 초기화
int i = 0;

// 입력 문자, 입력 문자 백업
char cmd = "";
char cmdM = "s";

void setup() {
//모니터링을 위한 시리얼 통신 설정
Serial.begin(9600); // 시리얼 통신

//mySerial은 소프트웨어 시리얼입니다. 아두이노 우노를 사용할 때 주석을 해제해주세요.
//mySerial.begin(9600); // 블루투스 통신

//Serial3는 아두이노 메가를 사용할 때 사용하는 시리얼입니다. 아두이노 우노를 사용하면 주석처리 하세요.
Serial3.begin(9600);

// 스텝모터 핀 모드 설정
pinMode(dirPinLR,OUTPUT);
pinMode(stepPin,OUTPUT);
pinMode(enA, OUTPUT);
digitalWrite(enA, HIGH);
pinMode(rst, OUTPUT);
digitalWrite(rst, LOW);

// 드라이브모터 핀 모드 설정
pinMode(PWM,OUTPUT);
pinMode(DIR, OUTPUT);

// 페달모드 전진 후진 신호
pinMode(pedalF, INPUT_PULLUP);
pinMode(pedalB, INPUT_PULLUP);
pinMode(ground, OUTPUT);
digitalWrite(ground, LOW);

Serial.println("AI Go-Kart is Ready!");
}

void loop() {

//  modestate가 1이면 페달제어 모드로 수행
if(modeState == 1) {
// 전진, 후진 스위치 값 저장
pedalFVal = digitalRead(pedalF);
pedalBVal = digitalRead(pedalB);

// 페달값 센싱-매핑-한계범위설정
pedalVal = analogRead(pedalSensor);
Serial.print("pedal :");
Serial.println(pedalVal);

pedalVal = map(pedalVal, 180, 870, 0, 255);
pedalVal = constrain(pedalVal, 0, 255);

// 페달 값 변화 시리얼 모니터 링
Serial.print(pedalFVal);
Serial.print("  ");
Serial.print(pedalBVal);
Serial.print("  ");
Serial.print(pedalVal);
Serial.print("  ");

// 페달 신호가 0이면 브레이킹
if (pedalVal == 0) {
digitalWrite(DIR,LOW);
analogWrite(PWM, 0);
delay(100);
}

// 전진, 후진 스위치 값에 따른 페달 동작
if (pedalFVal == 1 && pedalBVal == 1) {
digitalWrite(DIR,HIGH);
analogWrite(PWM, pedalVal);
Serial.println("RRRR");
} else if (pedalFVal == 1 && pedalBVal == 0) {
digitalWrite(DIR,LOW);
analogWrite(PWM, pedalVal);
Serial.println("FFFF");
} else {
digitalWrite(DIR,LOW);
analogWrite(PWM, 0);
Serial.println("SSSS");
}
}

// 아두이노 메가를 쓸 때는 Serial3를 그대로 사용하고, 아두이노 우노를 쓸 때는 Serial3를 mySerial로 수정해주세요.
// 아두이노 메가를 쓸 때는 SW6 스위치를 3번쪽으로 옮기고, 아두이노 우노를 쓸 때는 SW6 스위치를 1번쪽으로 옮겨주세요.

//  if (Serial3.available() ){        // 블루투스 통신에 데이터가 있을 경우
cmd = Serial3.read();     // 블루투스의 데이터(문자 한 글자)를 'cmd' 변수에 저장
//    cmd = Serial.read(); 수동모드일 경우, if(Serial3.available()) 주석처리 후, Seral.read() 사용

// cmd 변수의 데이터가 m이면 수동모드로, i면 앱모드로 modeState 변수의 상태를 바꿈
if (cmd == 'm') {
modeState = 1;
Serial.println("input 'm'");
Serial.println("the mode is : manual control");
}

if (cmd == 'i') {
modeState = 0;
Serial.println("input 'i'");
Serial.println("the mode is : app control");
}

// modestate가 0이면 앱제어 모드로 수행
if (modeState == 1) {
if (cmd == 'w' ){               // 만약 w가 입력되면 이전 입력값'cmdM'을 확인하고, cmdM이 w이면 전진유지, 아니면 천천히 가속하여 전진
Serial.println(cmd);
if(cmdM == 'w'){
forward();
} else {
i = 0;
forward();
}
cmdM = 'w';
} else if ( cmd == 'x') {        // 만약 x가 입력되면 이전 입력값'cmdM'을 확인하고, cmdM이 x이면 후진유지, 아니면 천천히 가속하여 후진
Serial.println(cmd);
if(cmdM == 'x') {
backward();
} else {
i = 0;
backward();
}
cmdM = 'x';
} else if ( cmd == 'a' ) {       // 아니고 만약 'cmd' 변수의 데이터가 a면 좌회전
right();
} else if ( cmd == 'd' ) {       // 아니고 만약 'cmd' 변수의 데이터가 d면 우회전
left();
} else if ( cmd == 's' ) {       // 아니고 만약 'cmd' 변수의 데이터가 s면 정지
motorStop();
} else if ( cmd == 'o' ) {       // 아니고 만약 'cmd' 변수의 데이터가 o면 속도 줄이기
valocity -= 30;
if (valocity < 30) {
valocity = 30;
}
Serial.print("Speed Down! Current Speed is ");
Serial.println(valocity);
} else if ( cmd == 'p' ) {       // 아니고 만약 'cmd' 변수의 데이터가 p면 속도 높이기
valocity += 30;
if (valocity > 250) {
valocity = 250;
}
Serial.print("Speed Up! Current Speed is ");
Serial.println(valocity);
}
}
}
//}

void left() {
// 조향 모터가 '반시계방향'으로 회전하도록 신호부여
digitalWrite(dirPinLR,LOW);

if (rotatePos > rotateLeftLimit) {
// 1000마이크로초 주기로 모터 축이 1.5회전하는 코드
// 1:50 기어박스 내장되어 있으므로, 모터 1회전에 바퀴 7.2도 회전함
// 따라서, 모터가 1.5회전하면 바퀴가 10.8도 회전함
for(int x = 0; x < STEPS_PER_REV*0.3; x++) {
digitalWrite(enA,HIGH);
digitalWrite(stepPin,HIGH);
delayMicroseconds(500);
digitalWrite(stepPin,LOW);
delayMicroseconds(500);
}
rotatePos = rotatePos - 1;
} else {
rotatePos = rotateLeftLimit;
}
Serial.println(rotatePos);
}

void right() {
// 조향 모터가 '시계방향'으로 회전하도록 신호부여
digitalWrite(dirPinLR,HIGH);

if (rotatePos < rotateRightLimit) {
for(int x = 0; x < STEPS_PER_REV*0.3; x++) {
digitalWrite(enA,HIGH);
digitalWrite(stepPin,HIGH);
delayMicroseconds(500);
digitalWrite(stepPin,LOW);
delayMicroseconds(500);
}
rotatePos = rotatePos + 1;
} else {
rotatePos = rotateRightLimit;
}
Serial.print("rotatePos is : ");
Serial.println(rotatePos);
}

void forward() {
//드라이브 모터가 앞으로 회전하도록 신호부여
digitalWrite(DIR,LOW);
analogWrite(PWM, i);

if (i != valocity) {
for (i = 0; i < valocity; i = i + 10) {
analogWrite(PWM, i);
delay(100);
}
}

if (rotateMid > rotatePos) {
int j = rotateMid - rotatePos;
for (int k = 0; k < j; k++) {
right();
}
} else if (rotateMid == rotatePos) {

} else if (rotateMid < rotatePos) {
int j = rotatePos - rotateMid;
for (int k = 0; k < j; k++) {
left();
}
}
Serial.println("forward");
}

void motorStop() {
digitalWrite(DIR,LOW);

analogWrite(PWM, 0);
delay(100);
Serial.println("motorStop");

cmdM = 's';
}

void backward() {
////드라이브 모터가 뒤로 회전하도록 신호부여
digitalWrite(DIR,HIGH);
analogWrite(PWM, i);

if(i != valocity) {
for (i = 0; i < valocity; i = i + 10) {
analogWrite(PWM, i);
delay(100);
}
}
Serial.println("backward");
}

# data[].attributes.body
modeState = 0 으로 변경해야, cmd로 제어할 수 있음.

if (Serial3.available()) {} 주석 처리
cmd = Serial3.read(); 주석 처리

아래에
cmd = Serial.read() 추가

# data[].attributes.headline
녹색 ㅡ 입력 신호빨강 ㅡ 5

# data[].attributes.body
녹색 ㅡ 입력 신호
빨강 ㅡ 5V
노랑 ㅡ GND

# data[].attributes.body
github.com/mtinet/teachableMachineProject

# data[].attributes.attachment_link.description
파이썬(3.8.6까지 구동 확인)에 tensorflow(2.3.1까지 구동 확인), PIL(pillow), opencv-python, pyserial 라이브러리를 설치해 사용함 로컬에서 웹캠 영상을 가져와서 학습된 모델의 레이블에 있는 클래스를 정규화된 비율로 출력함 정규화된 특정 결과값의 비중(0.7 이상)에 따라 시리얼 통신으로 utf-8의 형태의 'a', 'b', 'c'를 송신함 송신된 데이터에 의해 동작하는 간단한 Arduino 파일을 첨부함 아두이노 파일(dataReceiveTest.ino)은 'a'가 들어오면

# data[].attributes.body
with 이건우

# data[].attributes.body
구본민
윤지성
방은표
조형래
허정우
임종욱

# data[].attributes.body
정경근
박수영
김유림
이혜원
박광호
민복기

# data[].attributes.body
김자현
도원규
윤동원
이건우
정승혁
진형민

# data[].attributes.body
하수민
방승현
홍은빈
변승환
유현서
김경빈

# data[].attributes.body
김민혁
이용정
전민경
박지민
이재은
김준화

# data[].attributes.body
강재서
박니아
김수완
김도현
엄지혜
황채원

# data[].attributes.body
https://editor.p5js.org/mtinet/full/uyf_h2dOO

# data[].attributes.attachment_link.description
A web editor for p5.js, a JavaScript library with the goal of making coding accessible to artists, designers, educators, and beginners.