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

신호등 정보 시스템

구성품 및 소모품

Arduino 윤
× 1
Arduino UNO
또는 기타 Arduino 보드
× 1
초음파 센서 - HC-SR04(일반)
× 1
DS3231 RTC
실시간 시계
× 1
LED(일반)
빨간색 LED 1개, 노란색 LED 1개, 녹색 LED 1개
× 3
저항 330옴
× 3
433MHz 모듈
1 x 송신기, 1 x 수신기
× 1
Android 기기
× 1
SD 카드
× 1
AllThingsTalk IOTOPIA 빠른 개발 키트
× 1
점퍼 와이어(일반)
× 1

앱 및 온라인 서비스

Arduino IDE
Android 스튜디오
MySQL 데이터베이스 호스팅 서비스

이 프로젝트 정보

소개

교통은 우리 모두를 짜증나게 할 수 있는 능력이 있으며 점점 더 악화되고 있습니다. 그것이 지능형 신호등으로 바뀔 수 있다면 어떨까요? 우리는 교차로에 도달하고 최고 속도 제한을 초과하지 않고 녹색 신호를 통과하기 위해 운전해야 하는 속도를 운전자에게 알려주는 신호등 정보 시스템을 만들었습니다. 그리고 운전자가 피할 수 없는 빨간 신호를 기다려야 할 때 신호가 녹색으로 바뀌려고 할 때 이를 알려줍니다.

신호등은 녹색으로 유지되는 기간 또는 다음 녹색 신호등까지의 시간에 대한 데이터를 온라인 데이터베이스로 보냅니다. 스마트폰의 GPS 또는 애플리케이션은 데이터베이스에서 데이터를 검색하고 녹색 신호를 통과하는 데 필요한 속도를 계산합니다. 부득이하게 기다려야 하는 경우 적색등 단계가 끝날 때까지 남은 대기 시간을 표시합니다.

제한을 유지하면서 70km/h 구역에서 운전하고 있습니다. 앞에 있는 신호등은 빨간색이고 30초 후에 신호등이 녹색으로 바뀝니다. 신호등에서 500미터 떨어져 있으므로 시스템에서 신호등 쪽으로 60km/h로 진행하도록 권장합니다.

프로젝트 시연

우리는 그것을 어떻게 만들었을까?

프로젝트를 시연하기 위해 Arduino Yun으로 신호등을 만들었습니다. 신호등은 3개의 LED와 실시간 시계로 구성됩니다. 조명은 지정된 간격으로 변경됩니다. Arduino Yun은 신호등이 녹색/빨간색으로 바뀌는 시간을 절약합니다. 그런 다음 온라인 MySQL 데이터베이스에 연결하고 Arduino Yun에서 받은 데이터를 삽입하는 PHP 파일을 실행합니다. Android 앱(Android Studio로 생성)은 해당 데이터베이스에서 날짜를 검색합니다. 이것은 JSON 형식으로 신호등 데이터를 반환하는 다른 PHP 파일을 통해 수행됩니다. 앱은 원하는 속도를 계산하고 녹색 신호를 통과할 수 없을 때 카운트다운 타이머를 표시합니다.

원하는 속도를 계산하려면 앱이 신호등까지의 거리를 알아야 합니다. 이것은 GPS 좌표에 따라 거리를 계산하여 수행됩니다. 그러나 불행히도 스마트폰의 GPS는 소규모로 작업하고 있기 때문에 우리의 개념을 증명할 만큼 정확하지 않습니다. 그래서 초음파 거리 측정 모듈(HC-SR04)을 사용했습니다. Arduino Yun은 433MHz RF 모듈을 통해 자동차와 신호등 사이의 거리를 수신합니다. Yun은 다른 Arduino로부터 새로운 측정값을 받을 때마다 데이터베이스의 데이터를 업데이트합니다. 이제 앱에서 원하는 속도를 계산할 수 있습니다.

지침

1) 온라인 MySQL 데이터베이스 생성

(우리는 freemysqlhosting.net을 사용했습니다)

2) 데이터베이스에 'TrafficL_data' 테이블 추가:

3) 하드웨어(송신기) 설정

여기에서 회로도 'Arduino 송신기'를 찾을 수 있습니다.

4) Arduino에 'Arduino 송신기 코드' 업로드

여기에서 코드를 찾을 수 있습니다.

5) Arduino Yun을 WiFi 네트워크에 연결

6) Putty를 사용하여 Arduino YUN의 Linux 서버에 액세스:

opkg 업데이트 opkg 설치 php5-mod-mysqli opkg 설치 php5-cli nano /mnt/sda1/MySQL_UpdateTrafficLData.php 설치 

여기에서 'MySQL_UpdateTrafficLData.php'를 찾을 수 있습니다.

'-ash:nano:not found' 오류가 표시되면 'nano'를 설치해야 합니다(기본 텍스트 편집기).

opkg 설치 나노 

chmod 755 /mnt/sda1/MySQL_UpdateTrafficLData.php/mnt/sda1/MySQL_UpdateTrafficLData.phpnano /mnt/sda1/MySQL_UpdateDistance.php 

여기에서 'MySQL_UpdateDistance.php'를 찾을 수 있습니다.

chmod 755 /mnt/sda1/MySQL_UpdateDistance.php/mnt/sda1/MySQL_UpdateDistance.php 

7) 하드웨어 설정(Arduino Yun 수신기)

여기에서 회로도 'Arduino Yun 수신기'를 찾을 수 있습니다.

8) Arduino Yun에 'Arduino Receiver &MySQLdb' 업로드

여기에서 코드를 찾을 수 있습니다.

9) 직렬 모니터 열기

비슷한 내용이 표시되어야 합니다.

11) Android 스튜디오 파일

<울>
  • 활동_메인.xml
  • MainActivity.java*
  • AndroidManifest.xml
  • strings.xml
  • *URL 변경을 잊지 마세요.

    여기에서 'EchoJSON.php'를 찾을 수 있습니다.

    12) Android Studio 프로젝트를 스마트폰에 업로드

    ESP8266 지침 [추가]

    더 비싼 Arduino Yun 대신 ESP8266 기반 모듈을 사용할 수 있습니다.

    1. https://www.000webhost.com

    에서 계정 생성

    2. 웹사이트 만들기

    3. 새 데이터베이스 생성

    4. 파일 관리자로 'CreateTable.php'와 'PostDemo.php'를 업로드합니다. 두 파일 모두 'username', 'password', 'dbname'을 변경합니다.

    CreateTable.php:

    connect_error) { die("연결 실패:" . $conn->connect_error);}// trafficl_data_v2 is 테이블 이름 $sql ="CREATE TABLE trafficl_data_v2 ( UnixTime_green_1 INT(12) NOT NULL, UnixTime_red_1 INT(12) NOT NULL, UnixTime_green_2 INT(12) NOT NULL, UnixTime_red_2 INT(12) NOT NULL, 거리 INT(12) NOT NULL, id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY )";if ($conn->query($sql) ===TRUE) { echo "테이블이 성공적으로 생성되었습니다!";} else { echo "테이블 생성 오류:" . $conn->오류;}$conn->close();?> 

    PostDemo.php:

    connect_error) { die("데이터베이스 연결 실패:" . $conn->connect_error); }if (!empty($_POST['UnixTime_green_1']) &&!empty($_POST['UnixTime_red_1']) &&!empty($_POST['UnixTime_green_2']) &&!empty($_POST['UnixTime_red_2']) ) { $UnixTime_green_1 =$_POST['UnixTime_green_1']; $UnixTime_red_1 =$_POST['UnixTime_red_1']; $UnixTime_green_2 =$_POST['UnixTime_green_2']; $UnixTime_red_2 =$_POST['UnixTime_red_2']; $sql ="업데이트 `trafficl_data_v2` SET `UnixTime_green_1`='5',`UnixTime_red_1`='6',`UnixTime_green_2`='7',`UnixTime_red_2`='8',`Distance`='99' WHERE 1 "; if ($conn->query($sql) ===TRUE) { echo "데이터가 성공적으로 삽입되었습니다!"; } else { echo "오류:" . $sql . "
    " . $conn->오류; }}else { echo "FAILED:잘못된 매개변수";}$conn->close();?>

    5. 새 테이블 만들기:'CreateTable.php'를 선택하고 '보기'를 클릭합니다.

    6. arduino에 ESP8266용 패키지 설치

    이 URL 파일 추가--> 기본 설정:

    http://arduino.esp8266.com/stable/package_esp8266com_index.json

    7.

    [2019년 2월 9일 업데이트]

    보드, COM 포트 ...를 선택하고 ESP8266PostDemo.ino를 ESP8266 기반 보드에 업로드하십시오. NodeMcu V3 ESP8266 12E를 사용하고 있습니다. 아래 코드는 거의 모든 ESP8266 기반 보드에서 작동합니다.

    더 이상 손에 시계가 없기 때문에 데이터베이스가 10초마다 임의의 값으로 업데이트되도록 코드를 변경했습니다.

    ESP8266PostDemo.ino:

    #include #include  #include #include #define ARRAYSIZE 4 // 4개의 인수const char* ssid ="yourSSID"; const char* 암호 ="yourPassword"; const char* dest ="http://xxxxx.000webhostapp.com/xxxxx/ ... /xxxxx.php"; // 요청 대상const char* argument_names[ARRAYSIZE] ={"UnixTime_green_1","UnixTime_red_1","UnixTime_green_2","UnixTime_red_2"};const String equals_sign ="=";const String ampersand_sign ="&";void setup() { 지연(1000); Serial.begin(115200); WiFi.mode(WIFI_OFF); //재연결 문제 방지(연결 시간이 너무 오래 걸림) delay(1000); WiFi.mode(WIFI_STA); //이 줄은 ESP를 wifi 핫스팟으로 보는 것을 숨깁니다. WiFi.begin(ssid, password); Serial.println(""); Serial.print("연결 중"); 동안 (WiFi.status() !=WL_CONNECTED) { 지연(500); Serial.print("."); } 직렬.println(""); Serial.print("연결됨"); Serial.println(ssid); Serial.print("IP 주소:"); Serial.println(WiFi.localIP()); } 무효 루프() { HTTPClient http; 문자열 매개변수 =""; 매개변수 +=인수_이름[0] +equals_sign+ (int)random(100); for(int i=1; i 

    PHP 파일:

    connect_error) { die("데이터베이스 연결 실패:" . $conn->connect_error); } if (!empty($_POST["UnixTime_green_1"]) &&!empty($_POST["UnixTime_red_1"]) &&!empty($_POST["UnixTime_green_2"]) &&!empty($_POST["UnixTime_red_2"]) ) { $UnixTime_green_1 =$_POST["UnixTime_green_1"]; $UnixTime_red_1 =$_POST["UnixTime_red_1"]; $UnixTime_green_2 =$_POST["UnixTime_green_2"]; $UnixTime_red_2 =$_POST["UnixTime_red_2"]; $sql ="업데이트 트래픽L_data SET UnixTime_green_1='$UnixTime_green_1', UnixTime_red_1='$UnixTime_red_1',UnixTime_green_2='$UnixTime_green_2', UnixTime_red_2='$UnixTime_red_2' WHERE id=1"; if ($conn->query($sql) ===TRUE) { echo "OK"; } else { echo "오류:" . $sql . "
    " . $conn->오류; } }?>

    데이터베이스 업데이트에 성공했다면 'Arduino Receiver &MySQLdb'의 arduino 코드에서 다음 절차를 수정할 수 있습니다.

    <울>
  • MySQL_UpdateTrafficLData() 무효
  • MySQL_UpdateDistance() 무효화
  • 프로젝트를 복제하려는 경우 모든 것을 한 번에 구현하는 것은 좋지 않습니다. 먼저 각 구성 요소를 개별적으로 테스트해 보십시오. 모두 잘 작동하면 다른 구성 요소를 결합하여 시작할 수 있습니다. 댓글 섹션에서 자유롭게 도움을 요청하고 문제를 최대한 자세히 설명하세요.

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

    코드

    <울>
  • Arduino 송신기 코드
  • Arduino 수신기 및 MySQLdb
  • MySQL_UpdateTrafficLData.php
  • MySQL_UpdateDistance.php
  • 에코JSON
  • MainActivity.java
  • AndroidManifest.xml
  • strings.xml
  • 활동_메인.xml
  • Arduino 송신기 코드Arduino
    /* IOTOPIA - 2016-2017 - 신호등 정보 시스템(송신기) * by Pieter Luyten &Joppe Smeets * * RF 433MHz 모듈을 통해 다른 arduino까지 거리 보내기 * * RF 433MHz 모듈:* tx_pin --> pin 3 * * HC-SR04 모듈:* trig_pin --> 핀 5 * echo_pin --> 핀 6 * */#define tx_pin 3#define trig_pin 5#define echo_pin 6#include  // RF 433MHz 모듈용 라이브러리 #include "HCSR04.h" // HC-SR04용 라이브러리 moduleHCSR04 초음파(trig_pin,echo_pin); int distance;char CharMsg[21];void setup() { Serial.begin(9600); vw_setup(2000); // 초당 비트 수 vw_set_tx_pin(tx_pin);}void loop() { distance =초음파.Ranging(CM); // cm 단위로 거리를 측정합니다. while(distance <0){ // 잘못된 판독을 방지하고 거리를 다시 측정합니다. distance =초음파.Ranging(CM); } sprintf(CharMsg, "%d,", 거리); vw_send((uint8_t *)CharMsg, strlen(CharMsg)); // 거리 전송 vw_wait_tx(); // 전체 메시지가 사라질 때까지 기다립니다. Serial.print("Distance (cm):"); Serial.println(거리); 지연(250);}
    Arduino 수신기 및 MySQLdbArduino
    /* IOTOPIA - 2016-2017 - 신호등 정보 시스템(수신기 + MySQLdb에 업로드) * 작성자 Pieter Luyten &Joppe Smeets * * RF를 통해 다른 arduino에서 거리 수신 * MySQL 데이터베이스에 신호등 데이터 및 거리 업로드 * * RF 433MHz 모듈:* rx_pin --> 핀 3 * * 신호등(LED 3개):* RedLED --> 핀 5 * OrangeLED --> 핀 6 * GreenLED --> 핀 7 * * DS3231(실시간 클록) :* SCL --> SCL(Arduino Yun의 핀 3) * SDA --> SDA(Arduino Yun의 핀 2) * * SD 카드 - Arduino Yun * SD 카드(PHP 파일 포함)--> 통합 SD 슬롯* /#define RedLED 5#define OrangeLED 6#define GreenLED 7#define rx_pin 9#include  // RF 433MHz 모듈#include  // 알람#include  // I2C communication#include "RTClib.h" // Real Time Clock#include  // Linux 프로세스를 AR9331에서 실행 // UnixTime:1970년 1월 1일 이후 경과된 시간(초)으로 정의된 시간long UnixTime_green_1; // 다음 녹색 표시등(UnixTime에서)long UnixTime_red_1; // 다음 빨간불(UnixTime에서)long UnixTime_green_2; // 다음 단 하나의 녹색 표시등(UnixTime에서)long UnixTime_red_2; // 다음 단 하나의 빨간불(UnixTime에서)long s_till_orange; // OrangeRTC_DS3231까지의 시간(초) rtc;char StringReceived[22];boolean i;int interval =5; // 초 단위 int 거리; // cmvoid에서 setup() { rtc.begin(); //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)))); Serial.begin(9600); Bridge.begin(); // 브리지 초기화 vw_setup(2000); // 초당 비트 수 vw_set_rx_pin(rx_pin); vw_rx_start(); Alarm.timerRepeat(간격, UpdateTrafficLData); // 신호등 데이터 업데이트(다음 녹색/빨간색 ... ) Alarm.timerRepeat(1,PrintCurrentTime); // x초마다 현재 시간을 출력합니다. pinMode(GreenLED, OUTPUT); 핀모드(주황색 LED, 출력); 핀모드(빨간색 LED, 출력); 디지털 쓰기(녹색 LED, 낮음); digitalWrite(주황색 LED, 낮음); 디지털 쓰기(빨간색 LED, 낮음); Serial.println("설정 완료");}void 루프() { Alarm.delay(0); // 이 지연은 알람과 타이머를 적시에 처리하기 위해 // 일반적인 Arduino delay() 대신 사용해야 합니다. 최소 지연을 위해 0을 전달할 수 있습니다. RF_듣기(); }무효 RF_Listen(){ uint8_t buf[VW_MAX_MESSAGE_LEN]; uint8_t 버퍼 =VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buflen)) { int a; for (a =0; a  0) { char c =p.read(); Serial.print(c); } // 데이터의 마지막 비트가 전송되었는지 확인합니다. Serial.flush();} 무효 MySQL_UpdateDistance(){ 프로세스 p; p.begin("/mnt/sda1/MySQL_UpdateDistance.php"); p.addParameter(문자열(거리)); p.run(); // 피드백 읽기(디버깅용) while (p.available()> 0) { char c =p.read(); Serial.print(c); } // 데이터의 마지막 비트가 전송되었는지 확인합니다. Serial.flush();} 무효 PrintCurrentTime() { 현재 날짜 시간 =rtc.now(); SetLEDsTrafficL(); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(지금.분(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.print(" "); Serial.println(now.unixtime());} 무효 SetLEDsTrafficL() { 현재 날짜 시간 =rtc.now(); s_till_orange =UnixTime_red_1 - now.unixtime(); if (i ==0) { digitalWrite(GreenLED, LOW); digitalWrite(주황색 LED, 낮음); 디지털 쓰기(빨간색 LED, 높음); } if (i ==1 &&s_till_orange <=3) { digitalWrite(GreenLED, LOW); 디지털 쓰기(주황색 LED, 높음); 디지털 쓰기(빨간색 LED, 낮음); } if (i ==1 &&s_till_orange> 3) { digitalWrite(GreenLED, HIGH); digitalWrite(주황색 LED, 낮음); 디지털 쓰기(빨간색 LED, 낮음); }}
    MySQL_UpdateTrafficLData.phpPHP
    #!/usr/bin/php-cliconnect_error) { trigger_error('데이터베이스 연결 실패:' . $conn->connect_error, E_USER_ERROR);} $sql="업데이트 트래픽L_data SET UnixTime_green_1='$UnixTime_green_1', UnixTime_red_1='$UnixTime_red_1',UnixTime_green_2='$UnixTime_green_2', UnixTime_red_2='$UnixTime_red_2' WHERE id=1";if($con ) ===false) { trigger_error('잘못된 SQL:' . $sql . ' 오류:' . $conn->error, E_USER_ERROR);}else{echo "데이터가 삽입되었습니다!\n";} ?>
    MySQL_UpdateDistance.phpPHP
    #!/usr/bin/php-cliconnect_error) { trigger_error('데이터베이스 연결 실패:' . $conn->connect_error, E_USER_ERROR );}$sql="UPDATE TrafficL_data SET Distance='$Distance'WHERE id=1";if($conn->query($sql) ===false) { trigger_error('잘못된 SQL:' . $sql . ' 오류:' . $conn->error, E_USER_ERROR);}else{echo "거리 삽입!\n";}?>
    EchoJSONPHP
    <사전>
    MainActivity.java자바
    패키지 com.example.xxx.xxx;// xxx xxximport android.support.v7.app.AppCompatActivity 가져오기 가져오기 android.os.Bundle 가져오기; android.util.Log 가져오기; android.widget.TextView 가져오기;com 가져오기 .android.volley.RequestQueue;import com.android.volley.Response;import com.android.volley.VolleyError;import com.android.volley.toolbox.JsonArrayRequest;import com.android.volley.toolbox.Volley;import org. json.JSONArray;import org.json.JSONException;import org.json.JSONObject;//import java.text.DateFormat;import java.util.Date;import java.util.Timer;//import java.util.TimerTask; import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class MainActivity extends AppCompatActivity { // 문자열 "data "는 결과 TextView 결과를 보유합니다. //권장 속도를 유지하는 텍스트 뷰 TextView recSpeed; // 파싱할 객체의 URL String JsonURL ="YourURLhere"; // 이 문자열은 결과를 보유할 것입니다. String data =""; // URL 요청을 동시에 처리하는 Volley 요청 큐 정의 RequestQueue requestQueue; //매초 데이터를 업데이트하는 타이머 객체 //타이머 타이머; //speedLimit(cm/s) private final static double maxSpeed ​​=18; //권장 속도 전용 2배속; // 테이블의 횟수 public final static int NUMBER_OF_ENTRIES =2; //녹색일 때 시간 배열 long[] unixTimesGreen =new long[NUMBER_OF_ENTRIES]; //빨간색일 때 시간 배열 long[] unixTimesRed =new long[NUMBER_OF_ENTRIES]; // 거리를 유지하는 변수 private double distance; // updateTable 반복 변수 private final ScheduledExecutorService scheduler =Executors.newSingleThreadScheduledExecutor(); // 테스트용:private Future timingTask; 공개 무효 틱(긴 밀리초) { timingTask =scheduler.scheduleAtFixedRate(new Runnable() { 공개 무효 실행() { updateTable(); } }, 0, 밀리초, TimeUnit.MILLISECONDS); } @Override protected void onCreate(Bundle storedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //결과를 결과로 변환하는 textViews =(TextView) findViewById(R.id.jsonData); recSpeed ​​=(TextView) findViewById(R.id.recommendedSpeed); //테이블 초기화 updateTable(); // 100밀리초마다 앱 업데이트 tick(500); // 반복적으로 업데이트하기 위해 타이머 객체로 작업하기 위해 /** timer =new Timer("Timer"); timer.schedule(new UpdateTable(),(long)100,(long)100); */ } // 반복적으로 업데이트하기 위해 타이머 객체를 사용하기 위해 /** private class UpdateTable extends TimerTask{ public void run(){ updateTable(); } } */ private void updateTable(){ //문자열 데이터 재설정 =""; // Volley 요청 큐를 생성합니다. requestQueue =Volley.newRequestQueue(this); // 테스트용 /** // id가 jsonData인 기본 레이아웃 XML에서 찾은 TextView로 결과를 캐스트합니다. results =(TextView) findViewById(R.id.jsonData); */ // arrayreq라는 JsonArrayRequest 클래스 생성, 필수 매개변수 전달 //JsonURL은 JsonArrayRequest에서 가져올 URL입니다. arrayreq =new JsonArrayRequest(JsonURL, // 두 번째 매개변수 Listener는 onResponse() 메서드를 재정의하고 //JSONArray를 전달합니다. 매개변수로 new Response.Listener() { // JSON 요청에서 응답을 받습니다. @Override public void onResponse(JSONArray response) { try { // 외부 배열에서 첫 번째 JSON 객체를 검색합니다. JSONObject TrafficLObj =response.getJSONObject( 0); // JSON 개체에서 "trafficArry"를 검색합니다. JSONArray trafficArry =TrafficLObj.getJSONArray("TrafficLArray"); // 개체를 가져와 더 이상 개체가 없을 때까지 목록 보기에 추가하는 JSON 배열을 반복합니다. trafficArry for (int i =0; i  maxSpeed) 속도 =maxSpeed; 그렇지 않으면 속도 =거리/((unixTimesGreen[간격]-시간)); 속도 =속도*5; }}
    AndroidManifest.xmlXML
    // xxx xxx 변경         
    strings.xmlXML
    "NooitRood", meaning:"NeverRed"
     NooitRood
    activity_main.xmlXML
      

    회로도

    RF 433MHz module:
    tx_pin --> pin 3

    HC-SR04 module:
    trig_pin --> pin 5
    echo_pin --> pin 6 RF 433MHz module:
    rx_pin --> pin 3

    TrafficLight (3 LEDs):
    RedLED --> pin 5
    OrangeLED --> pin 6
    GreenLED --> pin 7

    DS3231 (Real-Time-Clock):
    SCL --> SCL (pin 3 on Arduino Yun)
    SDA --> SDA (pin 2 on Arduino Yun)

    제조공정

    1. 가스 랜턴
    2. 레이저 포인터
    3. 만화경
    4. 교통 신호
    5. 발광 다이오드(LED)
    6. Zigbee 기반 LED 조명으로 분해
    7. Time of Flight 시스템 설계:시스템 개요
    8. 스마트 신호등
    9. 차량의 하이빔 라이트 시스템을 자동으로 제어하는 ​​새로운 AI
    10. LED 액세서리 –LED 조명 스트립 액세서리