산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

가상 Arduino 테니스

구성품 및 소모품

Arduino Nano R3
× 2
SparkFun 9DoF 센서 스틱
× 1
점퍼 와이어(일반)
× 1
NeoPixel 스트립
× 1
HC-05 블루투스 모듈
× 1
9V 배터리(일반)
× 1

필요한 도구 및 기계

납땜 인두(일반)

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

이 프로젝트는 게임 보드/디스플레이, 컨트롤러 및 마스터 라우터(Python 스크립트)의 세 부분으로 구성됩니다.

파트 1 - 디스플레이

디스플레이는 Arduino Nano에서 실행되는 15x10 네오픽셀 매트릭스입니다. 호스트 컴퓨터에서 실행되는 Python 스크립트의 게임 논리 및 입력을 처리합니다. 그것은 성장하고 매트릭스 아래로 더 이동하는 공을 표시하여 깊이와 공이 당신에게 오는 환상을 제공합니다. 공이 맞았음을 감지하면 공은 '멀리' 멀어지면서 다시 그려집니다.

포인트

공의 방향(왼쪽 또는 오른쪽)은 타격할 때마다 바뀝니다. 공을 놓치면 COM이 점수를 얻지만 COM이 공을 놓치면(25% 확률) 점수를 얻습니다. 이 게임 디자인은 테니스의 Wii 스포츠 버전과 유사합니다. COM이 플레이어를 상대로 득점할 때마다 점수가 표시됩니다.

높은 점수

0x04 주소의 I2C EEPROM에 저장된 실행 중인 최고 점수가 있습니다. 높은 점수를 유지하는 바이트를 유지합니다. 이전 최고 점수보다 높은 점수를 받은 경우 해당 주소를 덮어씁니다. COM이 10점을 받으면 게임 오버... 헷갈리면 논리 차트를 만들었습니다.

매트릭스 만들기

매트릭스를 만드는 데 시간이 걸리므로 여기에서 만든 가이드를 따르세요.

2부 - 컨트롤러

컨트롤러는 9DoF 스틱(3v3 전용!)과 HC-05 BLE 모듈이 연결된 또 다른 Arduino Nano입니다. x 또는 y 축의 가속도가 지정된 임계값보다 크면 직렬을 통해 '1'을 호스트 PC로 보내고 호스트 PC에서 디스플레이로 중계됩니다. Nano는 설정된 간격으로 x 및 y 가속도계를 읽은 다음 값이 1.5g 위 또는 아래로 떨어지는지 확인합니다. I2C 9 DoF 스틱에 액세스하려면 여기에서 다운로드할 수 있는 Sparkfun 라이브러리를 설치해야 합니다. 여기에 센서를 연결하고 기본 프로그램을 실행하는 방법에 대한 자습서도 있습니다.

라켓을 만들기 위해 상자를 사용한 다음 판지 조각에 라켓 모양을 잘라냈습니다. 거기에서 그것은 쉬웠습니다. 판지 컷 아웃 위에 흰 종이를 놓고 종이 위에 디자인을 그립니다. 나는 9v 배터리를 사용하여 설정에 전원을 공급했습니다. Nano의 Vin 핀을 통해 배터리를 실행해야 합니다. 그렇지 않으면 조정되지 않은 9v가 됩니다! 다음은 라켓 내부의 내부 사진입니다.

블루투스를 통해 통신

이제 이 복잡한 작업을 제어하는 ​​것이 무엇인지 궁금할 것입니다. 라켓은 디스플레이와 어떻게 대화합니까? 여기에 비밀이 있습니다. 그들은 서로 말을 하지 않습니다! 들어오는 Bluetooth COM 포트와 매트릭스 COM 포트를 사용하여 그들 사이에 정보를 전달하는 간단한 Python 스크립트가 있습니다. 또한 직렬 포트가 초기화될 때 둘 다 재설정되므로 두 시스템을 동기화하는 데 도움이 됩니다. 라켓은 블루투스를 통해 Python 스크립트에 '1'을 보내고 Python 스크립트는 매트릭스에 '1'을 보냅니다. 직렬 포트가 버퍼 오버플로를 얻지 않도록 1초의 디바운스가 있습니다(32비트 버퍼만 있음).

라켓

사진을 클릭하여 라켓을 제작한 방법을 살펴보세요.

새로운 테니스 게임과 함께 즐거운 시간 보내세요!

테니스 경기 영상:

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • 매트릭스 코드
  • 라켓 코드
  • 파이썬 코드
  • 매트릭스 코드C/C++
    매트릭스에 부착된 Arduino로 이동합니다.
    #include #include #include #include #include #define PIN 6 //matrix#define EEPROM_ADR 0x50용 데이터 핀 //EEPROM의 I2C 주소#define HS_ADR 0x02 //EEPROM의 최고 점수 바이트 주소#define NOTE_C1 33#define SPKR_PIN 3Adafruit_NeoMatrix matrix =Adafruit_NeoMatrix,(15_NeoMatrix PIN, NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800); int ball_x =7; //공의 X 좌표 ball_y =2; //공의 Y 좌표 반경 =1; //공의 반경int r_incr =1; //반경을 얼마나 늘릴 것인가 bybool isSwung =false; //라켓 스윙인트 ball_x_dir =1입니까? //공의 X 방향int ball_y_dir =1; //볼의 Y 방향 불 isDirRight =true;int score =0; //현재 gameint의 점수 COM_score =0;int highscore =0; //모든 gamesint 프레임 속도의 최고 점수 =50; //각 프레임 사이의 몇 ms int serial_data;String score_string ="";uint16_t colors[] ={matrix.Color(255,0,0),matrix.Color(0,255,0),matrix.Color(150,200,0) };int 멜로디[] ={0};int 템포[] ={0};정적 unsigned long lastFrame =0;void setup(){ Serial.begin(9600); matrix.begin(); matrix.fillScreen(0); matrix.setTextColor(색상[1]); randomSeed(analogRead(A2)); display_scores(); 최고 점수 =read_HS(); Serial.println(최고점수,DEC); matrix.setCursor(0,1); matrix.print("HS:"); matrix.show(); 지연(1000); matrix.fillScreen(0); matrix.setCursor(0,1); matrix.print(최고점수,DEC); matrix.show(); 지연(1000); score_string ="";}무효 루프(){ if((lastFrame+framerate)=5 &&ball_y <7 &&isSwung){ if(isDirRight){ ball_x_dir =-1; ball_y_dir =-1; } else if(!isDirRight){ ball_x_dir =1; ball_y_dir =-1; } r_incr =-1; } else if(ball_y>=8){ COM_score +=1; end_round(); } else if(ball_y <=2){ isDirRight =!isDirRight; int randNum =무작위(4); Serial.println(randNum); if(randNum ==2){ //COM 누락 점수의 25% 확률 +=1; if(점수> 최고점수){ write_HS(); } end_round; } else{ if(isDirRight){ ball_x_dir =1; ball_y_dir =1; } else if(!isDirRight){ ball_x_dir =-1; ball_y_dir =1; } r_incr =1; } } ball_x +=ball_x_dir; ball_y +=ball_y_dir; 반경 +=r_incr; matrix.fillScreen(0); matrix.fillCircle(ball_x,ball_y,반지름,색상[2]); matrix.show();} 무효 end_round(){ if(COM_score>=10){ end_game(); } isDirRight =참; r_incr =1; ball_x_dir =1; ball_y_dir =1; 공_x =7; ball_y =2; 반경 =1; display_scores(); matrix.fillScreen(0); matrix.fillCircle(ball_x,ball_y,반지름,색상[2]); matrix.show(); }무효 end_game(){ matrix.fillScreen(0); matrix.setCursor(0,1); matrix.setTextColor(색상[0]); matrix.drawLine(3,0,12,9,색상[0]); matrix.drawLine(11,0,2,9,색상[0]); matrix.show(); 지연(500); while(1){ }} 무효 display_scores(){ matrix.fillScreen(0); matrix.setTextColor(색상[1]); matrix.setCursor(0,1); score_string =문자열(점수) + "-" + 문자열(COM_score); 스크롤 텍스트(점수 문자열); matrix.fillScreen(0); 지연(2000); matrix.show();} 무효 scrollText(문자열 텍스트){ int pass =0; int x =matrix.width(); for(int i=0;i<24;i++){ matrix.fillScreen(0); matrix.setCursor(x,2); matrix.print(텍스트); x -=1; matrix.show(); 지연(150); }} 무효 write_HS(){ EEPROM.write(0x04,int(점수));}int read_HS(){ 바이트 HS =EEPROM.read(0x04); //주소 4에서 읽기 return HS;}
    라켓 코드C/C++
    #include #include #include LSM9DS1 imu;#define LSM9DS1_M 0x1E // SDO_M이 LOW이면 0x1C입니다.#define LSM9DS1_AG 0x6B // 이면 0x6A입니다. SDO_AG는 LOW#define PRINT_SPEED 10입니다. // 검사 사이의 10ms입니다. unsigned long lastPrint =0; // 인쇄 타임플로트 accelx =0;float accely =0;void setup() { // 여기에 설정 코드를 입력하여 한 번 실행:Serial.begin(9600);imu.settings.device.commInterface =IMU_MODE_I2C; imu.settings.device.m주소 =LSM9DS1_M; imu.settings.device.agAddress =LSM9DS1_AG; if (!imu.begin()) { //실패한 동안 (1); }}void loop() { if ((lastPrint + PRINT_SPEED) =1.5){ Serial.print(1); 지연(600); } else if(accely <=-1.5 || accely>=1.5){ Serial.print(1); 지연(600);}}
    파이썬 코드파이썬
    <사전> import serialimport timematrix_port ="COM3"raquet_port ="COM9"matrix =serial.Serial(matrix_port, 9600)racquet =serial.Serial(raquet_port,9600)time.sleep(10)while 1:data =racquet.read( ) data =="1"인 경우 데이터 인쇄:"hit" 인쇄 matrix.write("1") time.sleep(1) time.sleep(.05)

    회로도


    제조공정

    1. TinyML-Language Detector 기반 Edge Impulse 및 Arduino
    2. MPU-6050을 사용한 Arduino 자이로스코프 게임
    3. Arduino 디지털 주사위
    4. 아이언맨
    5. 나를 찾기
    6. Arduino 가습기 제어
    7. arduino를 사용한 소나 및 IDE 처리 시 표시
    8. MobBob:Android 스마트폰으로 제어되는 DIY Arduino 로봇
    9. Arduino Audio Reactive Desk Light
    10. NeoMatrix Arduino Pong