BASIC4MCU | 질문게시판 | 슈퍼루프 구조 질문입니다.
페이지 정보
작성자 손문일 작성일2018-12-03 00:00 조회5,616회 댓글0건첨부파일
본문
안녕하세요. 마스터님 항상 감사드립니다.
혼자 이것 저것 해보다 도저히 안되어서 질문 드립니다.
코딩내용
슈퍼 루프 구조
supersonic = 초음파 센서와 네오픽셀을 같이 넣었습니다.
(거리(distance)에 따라 네오픽셀을 다르게 하기 위해서 같은 루프안에 넣었습니다.)
servomotor = 모터 구동 코드
문제점
1. 초음파 센서 = 시리얼 모니터 값이 조금 느리게 인식되어져 표시 됩니다.
(초음파 센서 코딩만 따로 아두이노에 입력하면 잘나오는데 아래 코드로 하면 네오픽셀이 다 구동되고 나서 초음파를 쏘는듯합니다.)
2. 네오픽셀 = 모터가 처음 동작 전에 직지직 거리면서 아주 약하게 불이 깜박입니다.
3. 서보모터 = 처음 구동전에 혼자 직직직 거리고 난후에야 입력한데로 동작 됩니다.
아래에 동작 동영상도 포함해 넣었습니다.
void setup(){
supersonic_setup();
servomotor_setup();
}
void loop(){
supersonic_loop();
servomotor_loop();
}
#include <Adafruit_NeoPixel.h> //네오픽셀 라이브러리 불러오기
int PIN = 3; //네오픽셀 3번핀에 고정
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800); //위 pin3번이랑 대응
int supersonic_echo = 7; //초음파 센서 echo 7번핀
int supersonic_trig = 6; //초음파 센서 trig 6번핀
long supersonic_previousMillis = 0; //millis 함수
long supersonic_interval = 100; //millis 함수
void supersonic_setup() {
Serial.begin(115200); //초음파 센서
pinMode(supersonic_trig, OUTPUT); //초음파 센서
pinMode(supersonic_echo, INPUT); //초음파 센서
strip.begin(); //네오픽셀
strip.show(); //네오픽셀 Initialize all pixels to 'off'
}
void supersonic_loop() {
unsigned long currentMillis = millis();
if(currentMillis - supersonic_previousMillis >= supersonic_interval) {
supersonic_previousMillis = currentMillis;
float Length, distance; //초음파 센서
digitalWrite(supersonic_trig, HIGH);
digitalWrite(supersonic_trig, LOW);
Length = pulseIn(supersonic_echo, HIGH);
distance = ((float)(340 * Length) / 10000) / 2;
Serial.print(distance);
Serial.println(" Cm");
if(distance < 30){
for(int i=0; i<=255; i+=1){
strip.setPixelColor(0,strip.Color(0,50,255));
strip.setPixelColor(1,strip.Color(0,100,255));
strip.setPixelColor(2,strip.Color(0,150,255));
strip.setPixelColor(3,strip.Color(0,200,255));
strip.setPixelColor(4,strip.Color(0,255,255));
strip.setPixelColor(5,strip.Color(0,255,255));
strip.setPixelColor(6,strip.Color(0,255,255));
strip.setPixelColor(7,strip.Color(0,255,255)); //초록
strip.setPixelColor(8,strip.Color(255,255,0)); //노랑
strip.show(); delay(10);
}
for(int i=0; i<=255; i+=1){
strip.setPixelColor(0,strip.Color(0,50,255));
strip.setPixelColor(1,strip.Color(0,100,255));
strip.setPixelColor(2,strip.Color(0,150,255));
strip.setPixelColor(3,strip.Color(0,200,255));
strip.setPixelColor(4,strip.Color(0,255,255));
strip.setPixelColor(5,strip.Color(i,255-i,255-i));
strip.setPixelColor(6,strip.Color(i,255,255-i));
strip.setPixelColor(7,strip.Color(0,255,255)); //초록
strip.setPixelColor(8,strip.Color(255,255,0)); //노랑
strip.show(); delay(10);
}
for(int i=255; i>=0; i-=1){
strip.setPixelColor(0,strip.Color(0,50,255));
strip.setPixelColor(1,strip.Color(0,100,255));
strip.setPixelColor(2,strip.Color(0,150,255));
strip.setPixelColor(3,strip.Color(0,200,255));
strip.setPixelColor(4,strip.Color(0,255,255));
strip.setPixelColor(5,strip.Color(i,255-i,255-i));
strip.setPixelColor(6,strip.Color(i,255,255-i));
strip.setPixelColor(7,strip.Color(0,255,255)); //초록
strip.setPixelColor(8,strip.Color(255,255,0)); //노랑
strip.show(); delay(10);
}
}
else if (distance > 30){
for(int i=0; i<=255; i+=1){
strip.setPixelColor(0,strip.Color(255,50,0));
strip.setPixelColor(1,strip.Color(255,100,0));
strip.setPixelColor(2,strip.Color(255,150,0));
strip.setPixelColor(3,strip.Color(255,200,0));
strip.setPixelColor(4,strip.Color(255,255,0));
strip.setPixelColor(5,strip.Color(255,255,0));
strip.setPixelColor(6,strip.Color(255,255,0));
strip.setPixelColor(7,strip.Color(255,255,0)); //초록
strip.setPixelColor(8,strip.Color(255,255,0)); //노랑
strip.show(); delay(10);
}
}
}
}
#include <Servo.h> //servomotor
Servo servomotor; //servomotor
int servomotor_pos = 0; //servomotor
long servomotor_previousMillis = 0;
long servomotor_interval = 1000;
void servomotor_setup(){
servomotor.attach(9); //servomotor를 9번핀에 준비시킵니다.
}
void servomotor_loop(){
unsigned long currentMillis = millis();
if(currentMillis - servomotor_previousMillis >= servomotor_interval) {
servomotor_previousMillis = currentMillis;
for(servomotor_pos = 0; servomotor_pos < 180; servomotor_pos++)
{
servomotor.write(servomotor_pos); //servomotor.write(숫자)는 서보모터가 위치할 각입니다. 숫자가 90이면 90도로 이동합니다.
delay(15);
}
for(servomotor_pos = 180; servomotor_pos > 0; servomotor_pos--)
{
servomotor.write(servomotor_pos); //결과적으로 이 코드는 0~179도, 179~0도로 왕복합니다.
delay(15);
}
}
}
감사합니다.
댓글 0
조회수 5,616등록된 댓글이 없습니다.