반응형
이제부터 아두이노에서 p5.js로 데이터를 송수신 하는 방법을 알아보겠습니다. 송수신하는 데이터의 종류는 정수, 문자열입니다. 먼저 정수를 송수신하는 방법에 대해 알아보겠습니다.
=> 먼저 p5.js 에디터에서 index.html에서 <script>~</script> 뒤에 붙여넣기 한 후 저장한다.
<script src="https://unpkg.com/p5-webserial@0.1.1/build/p5.webserial.js"></script>
1. 정수 송수신
- 1 바이트(0~255) 범위의 값 중 0, 1 값을 송수신해 봅니다.
(1) LED 1개 동작 제어
- p5.js 캔버스에서 마우스를 클릭하여 LED가 점멸하도록 해봅시다.
- 아두이노 회로
- 아두이노 코드
// 수신된 정수로 LED 점멸 제어
#define LED 6
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
}
void loop() {
while (Serial.available()) { // 수신 여부 검사
int value = Serial.read(); // 수신값 읽기
if (value == 1) { // 수신값이 1인 경우
digitalWrite(LED, 1);
} else if (value == 0) { // 수신값이 0인 경우
digitalWrite(LED, 0);
}
}
}
- p5.js 소스
// p5.js: 마우스 클릭값(정수: 0,1) 송신
let port = new p5.WebSerial(); // 시리얼 통신을 위한 객체 생성
function setup() {
createCanvas(500, 200);
port.getPorts(); // 포트 사용 가능 여부 확인
port.on('noport', makePortButton); // 기존 선택한 포트가 없으면 makePortButton() 호출
port.on('portavailable', openPort); // 사용 가능한 포트가 있으면 openPort() 자동 호출
background(0);
fill(255, 255, 0);
textAlign(CENTER, CENTER);
textSize(30);
text('마우스를 눌러 LED 제어', width/2, height/2);
}
function draw() {
if (mouseIsPressed) {
port.write(1); // 1 송신
} else {
port.write(0); // 0 송신
}
}
function makePortButton() { // 포트 첫 연결 시 포트 선택 버튼 생성
let portButton = createButton('포트 선택'); // 버튼 생성
portButton.mousePressed(choosePort); // 버튼 누르면 choosePort() 자동 호출
function choosePort() { // 콜백함수
port.requestPort(); // 시리얼 포트 선택창 오픈
}
}
function openPort() { // 콜백함수
port.open().then(initiateSerial); // 포트를 오픈 후 initiateSerial() 자동 호출
function initiateSerial() { // 콜백함수
console.log('포트 오픈');
}
}
- 결과
(2) LED 여러 개 동작 제어
- 아두이노 회로
- 아두이노 소스
// 4개의 LED 제어
const int LED[] = {6, 7, 8, 9};
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(LED[i], OUTPUT);
}
Serial.begin(9600);
}
void loop() {
while (Serial.available()) {
int value = Serial.read();
// LED 전부 소등
for (int i = 0; i < 4; i++) {
digitalWrite(LED[i], 0);
}
// LED 점등
for (int i = 0; i < value; i++) {
digitalWrite(LED[i], 1);
}
}
}
- p5.js 소스
- 키보드 1~4를 눌러 LED제어하기
// p5.js: 키보드 정수(1∼4) 송신
let port = new p5.WebSerial();
function setup() {
createCanvas(500, 200);
port.getPorts();
port.on('noport', makePortButton);
port.on('portavailable', openPort);
background(0);
fill(255, 255, 0);
textAlign(CENTER, CENTER);
textSize(30);
text("1∼4키 누르기", width/2, height/2);
}
function draw() { }
function keyPressed() {
if (key === '1') port.write(1);
else if (key === '2') port.write(2);
else if (key === '3') port.write(3);
else if (key === '4') port.write(4);
else port.write(0);
}
function makePortButton() {
let portButton = createButton('포트 선택');
portButton.mousePressed(choosePort);
function choosePort() {
port.requestPort();
}
}
function openPort() {
port.open().then(initiateSerial);
function initiateSerial() {
console.log('포트 오픈');
}
}
- 결과
(3) 부저 소리내기
- 아두이노 회로
- 아두이노 소스코드
//수신된 정수로 부저 제어
#define BUZZER 12
void setup( ) {
pinMode(BUZZER, OUTPUT);
Serial.begin(9600);
}
void loop() {
while (Serial.available()) { // 검사
int value = Serial.read(); // 수신
if (value == 1) { // 1 수신
tone(BUZZER, 262);
} else { // 0 수신
noTone(BUZZER);
}
}
}
- p5.js. 소스코드
// p5.js: 마우스가 사각형 안에 들어가면 1 송신, 그렇지 않으면 0 송신
let port = new p5.WebSerial();
let x = 150, y = 150, w = 200, h = 200;
function setup() {
createCanvas(500, 500);
port.getPorts();
port.on('noport', makePortButton);
port.on('portavailable', openPort);
}
function draw() {
background(0);
if (mouseX > x && mouseX < x+w && mouseY > y && mouseY < y+h) {
fill(255, 0, 0);
port.write(1); // 1 송신
} else {
fill(0, 255, 0);
port.write(0); // 0 송신
}
rect(x, y, w, h);
}
function makePortButton() {
let portButton = createButton('포트 선택');
portButton.mousePressed(choosePort);
function choosePort() {
port.requestPort();
}
}
function openPort() {
port.open().then(initiateSerial);
function initiateSerial() {
console.log('포트 오픈');
}
}
(4) 키보드로 부저 작동하기(1~8키보드 숫자로 도레미파솔라시도 음계 재생)
- 아두이노 소스
#define BUZZER 12
void setup( ) {
pinMode(BUZZER, OUTPUT);
Serial.begin(9600);
}
void loop() {
while (Serial.available()) { // 검사
int value = Serial.read(); // 수신
if (value == 1) { // 1 수신
tone(BUZZER, 262);
}
else if (value == 2) { // 2 수신
tone(BUZZER, 293);
}
else if (value == 3) { // 3 수신
tone(BUZZER, 329);
}
else if (value == 4) { // 4 수신
tone(BUZZER, 349);
}
else if (value == 5) { // 5 수신
tone(BUZZER, 392);
}
else if (value == 6) { // 6 수신
tone(BUZZER, 440);
}
else if (value == 7) { // 7 수신
tone(BUZZER, 493);
}
else if (value == 8) { // 8 수신
tone(BUZZER, 523);
}
else { // 0 수신
noTone(BUZZER);
}
}
}
- p5.js 소스
// p5.js: 키보드 정수(1∼8) 송신
let port = new p5.WebSerial();
function setup() {
createCanvas(500, 200);
port.getPorts();
port.on('noport', makePortButton);
port.on('portavailable', openPort);
background(0);
fill(255, 255, 0);
textAlign(CENTER, CENTER);
textSize(30);
text("1∼8키 누르기", width/2, height/2);
}
function draw() { }
function keyPressed() {
if (key === '1') port.write(1);
else if (key === '2') port.write(2);
else if (key === '3') port.write(3);
else if (key === '4') port.write(4);
else if (key === '5') port.write(5);
else if (key === '6') port.write(6);
else if (key === '7') port.write(7);
else if (key === '8') port.write(8);
else port.write(0);
}
function makePortButton() {
let portButton = createButton('포트 선택');
portButton.mousePressed(choosePort);
function choosePort() {
port.requestPort();
}
}
function openPort() {
port.open().then(initiateSerial);
function initiateSerial() {
console.log('포트 오픈');
}
}
(4) DC 모터 동작 제어
- 아두이노 회로
- 아두이노 소스코드
// DC모터 제어
#define DC_FWD 9
#define DC_BWD 10
void setup() {
pinMode(DC_FWD, OUTPUT);
pinMode(DC_BWD, OUTPUT);
Serial.begin(9600);
}
void loop() {
while (Serial.available()) {
int value = Serial.read();
if(value==1){
digitalWrite(DC_FWD, 1);
digitalWrite(DC_BWD, 0);
}
else{
digitalWrite(DC_FWD, 0);
digitalWrite(DC_BWD, 0);
}
}
}
- p5.js 소스
// p5.js: 마우스가 사각형 안에 들어가면 1 송신, 그렇지 않으면 0 송신
let port = new p5.WebSerial();
let r=100;
function setup() {
createCanvas(500, 500);
port.getPorts();
port.on('noport', makePortButton);
port.on('portavailable', openPort);
}
function draw() {
background(0);
let d=dist(width/2, height/2, mouseX, mouseY);
if (d<r) {
fill(255, 0, 0);
port.write(1); // 1 송신
} else {
fill(0, 255, 0);
port.write(0); // 0 송신
}
ellipse(width/2, height/2, r*2, r*2);
}
function makePortButton() {
let portButton = createButton('포트 선택');
portButton.mousePressed(choosePort);
function choosePort() {
port.requestPort();
}
}
function openPort() {
port.open().then(initiateSerial);
function initiateSerial() {
console.log('포트 오픈');
}
}
반응형
'p5.js > p5.js' 카테고리의 다른 글
[2단계-2] 아두이노->p5.js 로 데이터(0~255) 송수신(가변저항) (0) | 2024.09.10 |
---|---|
[1단계-2] p5.js->아두이노로 정수(0~255) 데이터 송수신(LED, 서보모터) (0) | 2024.09.02 |
[2단계-1] 아두이노-> p5.js로 데이터(0, 1) 송수신 (버튼) (0) | 2024.09.02 |
p5.js로 이미지 다루기 (0) | 2024.08.22 |
p5.js 로 사운드 입출력하기 (0) | 2024.08.20 |