-
LTE CATM1, Azure IoT Central로 Connected Car 컨셉 제작Azure IoT 2023. 1. 6. 02:24
https://tech.hyundaimotorgroup.com/kr/mobility-service/connected-car-service/
최신 자동차들은 위와 같은 커넥티드 카를 콘셉트로 상시 연결되어 있는 자동차를 지향하고 있습니다.
자동차와 항상 연결되어 있어 사용자가 언제 어디서든 네트워크로 자동차의 서비스를 이용할 수 있고, 자동차의 소프트웨어를 OTA (Over The Air) 펌웨어 업데이트로 최신으로 유지하고 필요한 기능들을 On demand 형태로 구입하여 늘려나갈 수 있습니다. 자동차가 더 이상 이동을 위한 수단만이 아닌 서비스의 주체가 되는 시대에 살고 있습니다.
바로 접할 수 있는 서비스는 현재자동차의 블루링크 입니다.
https://thatside.tistory.com/entry/%ED%98%84%EB%8C%80%EC%9E%90%EB%8F%99%EC%B0%A8-%EB%B8%94%EB%A3%A8%EB%A7%81%ED%81%AC-%EA%B8%B0%EB%8A%A5-%EA%B0%80%EA%B2%A9%EA%B0%80%EC%9E%85%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0여기서 더욱 확장된 자율주행 시스템 같은 경우 테슬라에서 월구독료 형태로 지속적인 소프트웨어 관리와 함께 제공하고 있는 상황입니다.
https://www.motorgraph.com/news/articleView.html?idxno=30512
물론 이러한 Connected Car의 기술 주도권은 자동차 회사가 지니고 있습니다. 그래서 최신 자동차에 국한된 이야기인 지라 기존 차량을 새 차로 바꿔야 고려해 볼 수 있을 것 같습니다.
차와 관련된 기능을 네트워크에 연결하는 일은 보편적으로 사용하는 네트워크 환경에서는 쉽지 않습니다.
와이파이나 이더넷, 블루투스와 같은 방법으로는 상시 네트워크 연결이 불가능하기 때문 입니다.
상시 연결이 가능한 네트워크 서비스를 통해 연결해야 해서 결론은 셀룰러 통신 방법 밖에 없습니다.
LTE, 5G와 같은 통신으로 연결하지 않으면 어디서나 네트워크에 접속되어 있는 환경을 만들 수 없습니다.
더불어 또 한가지 중요한 요소는 인증받은 네트워크 시스템에 연결해야 한다는 것입니다.
이동하는 차량의 특성상 네트워크 시스템의 안정성은 타협할 수 없는 요소가 됩니다. 특히 상태 모니터링이 아닌 제어 기능을 구현할 경우 신뢰할 만한 시스템이 아니면 사용자가 모든 보안위협 요소를 지속적으로 관리, 검토, 개선해야 하는데 현실적으로 불가능한 일이기 때문입니다.
Connected Car를 구현한다고 하는것은 간단한 IoT 센서를 만드는 일과는 다르다는 무게감 때문에 그동안 많이 망설였었습니다. 그래서 위 두 가지 조건이 모두 만족해야 한다는 기본조건에서 Connected Car 콘셉트를 오픈소스로 제작하게 되었습니다.
사용한 재료는 아래와 같습니다.
1. LTE CATM1 내장형 모뎀
https://www.devicemart.co.kr/goods/view?no=14077527이동하는 자동차에서 항상 연결되어 있어야 하기에 LTE CATM1 내장형 모뎀을 선택 했습니다.
2. Vodafone Global IoT Sim
https://smartstore.naver.com/codezoo/products/7153689192대한민국뿐 아니라 다른 국가에서도 테스트할 수 있도록 Global IoT SIM을 선택했습니다. 한국에서는 SKT, KT망에 로밍해서 데이터통신이 가능하고 해외 180개국 이상에서 Glbal 통신사인 Vodafone 로밍네트워크를 이용해서 통신이 가능합니다.
3. Azure
https://azure.microsoft.com/en-us/마이크로소프트는 오랜시간을 거쳐 전 세계 수많은 개발자, 고객사들을 통해 신뢰를 쌓았습니다. Azure 클라우드 서비스를 통해 위에서 언급한 신뢰할 수 있는 네트워크시스템을 저렴한 가격에 확보할 수 있습니다. 해당 콘셉트에서는 Azure의 수많은 서비스 중 Azure IoT Central 서비스를 사용합니다.
4. ESP32
https://www.espressif.com/en/products/socs/esp32Wi-Fi, Bluetooth가 통합되어 있는 저전력 무선MCU 입니다. 다양한 IoT 오픈소스를 통해 개발자가 손쉽게 IoT 제품개발을 할 수 있도록 돕고 있습니다
5. Arduino
https://www.arduino.cc/MCU에 대한 전문지식 없이도 사용자가 손쉽게 다양한 전자부품을 연결해서 하드웨어 제품콘셉트를 만들어 볼 수 있도록 공개된 오픈하드웨어플랫폼 제작을 위한 개발환경입니다. 커넥티드 카의 손쉬운 기능확장을 고려해서 선택했습니다.
과정보다는 결과를 먼저 볼까요?영상을 잘 보셨나요? 자동차와 스마트폰앱이 모두 보이는 환경에서 촬영했지만, 사실 같은 공간에 없어도 괜찮습니다. 자동차 내부에 LTE CATM1으로 Azure 클라우드 시스템과 상시 연결되어 있는 배터리 기반 시스템이 설치되어 있기 때문입니다.
KeyLock & KeyUnlock을 위한 하드웨어 구성은 아래와 같습니다.서보모터(MG995)와 스마트키에 맞춘 기구디자인(테크트리스페이스 제공, https://www.techtreespace.com/)을 통해 KeyLock, KeyUnlock 신호를 Azure 클라우드를 통해 전송 받게 되면 동작됩니다. 해당 스마트키는 쌍용자동차 제품으로 기구도 거기에 맞춰서 설계가 되어 있는데, 타사 제품의 경우에는 조정이 필요합니다.
참고를 위해 기구 설계 과정 영상을 올려 둡니다. 퓨전360강의 필요하시면 언제든 테크트리스페이스 신건대표님에게 문의 부탁 드리겠습니다. ( fairway911@techtreespace.com )전체 셋트에서 배터리시스템은 태양광충전까지 가능한 배터리시스템으로 한번 더 수정했습니다.
최종 셋트의 동작 영상은 아래와 같습니다. 스마트폰을 제외한 나머지 시스템은 자동차 내부에 내장됩니다.해당 제품은 배터리로 동작되기 때문에 차량 내 시스템에서 상시 연결된 Azure 클라우드로 1시간에 1회씩 배터리 전압값을 모니터링해서 업로드하도록 구성하였습니다. 하드웨어를 신규로 만든 것이 아니라서 아래와 같은 회로를 참고해서 간단하게 만들었습니다.
리튬충전지의 특성상 아래와 같은 그래프를 보여주기 때문에 약 3.5V를 컷오프로 잡아서 모니터링 하고 있습니다. 더 떨어지게 되면 배터리 수명에도 영향을 주기 때문에 더 떨어지기 전에 충전 또는 충전된 배터리로 교체해야 합니다.
오픈소스 소개
https://github.com/codezoo-ltd/ppposclientSecure이번 작업은 기존에 작업해 둔 ppposclientSecure 프로젝트에 add-on 하는 방식으로 진행 했습니다.
라이브러리에 azure iot central 동작코드를 추가하고, example에서 호출하는 방식 입니다.
https://github.com/codezoo-ltd/ppposclientSecure/blob/main/examples/azure_iot_central_test/azure_iot_central_test.ino
예제코드 중 핵심이 되는 부분만 체크해 보겠습니다.
1. AzureIoTCentral 접속 정보
iot.configs("", // ID scope
"", // Device ID
"" // Primary key
);
ID scope, Device ID, Primary key는 AzureIoTCentral에 디바이스를 연결할 때 필요한 정보입니다. 뒤에서 AzureIoTCentral 서비스를 이용해서 클라우드에 연결할 디바이스를 생성하는데 그때 정보가 만들어 지므로 해당정보를 사용하면 됩니다.
2. 서보모터 각도 제어
void servoUp() {
myservo.attach(servoPin, 1000,
2000); // attaches the servo on pin 27 to the servo object
// using default min/max of 1000us and 2000us
// different servos may require different min/max settings
// for an accurate 0 to 180 sweep
for (pos = 70; pos <= 120; pos += 1) { // goes from 70 degrees to 120 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(5); // waits 5ms for the servo to reach the position
}
for (pos = 120; pos >= 40; pos -= 1) { // goes from 120 degrees to 40 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(5); // waits 5ms for the servo to reach the position
}
myservo.detach();
}
void servoDown() {
myservo.attach(servoPin, 1000,
2000); // attaches the servo on pin 27 to the servo object
for (pos = 0; pos <= 70; pos += 1) { // goes from 0 degrees to 70 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(5); // waits 5ms for the servo to reach the position
}
myservo.detach();
}
이부분은 해당 스마트키에 따라서 기구를 설계하면서 조정해야 하는 부분입니다.
어느 정도 각도로 좌우로 움직일지 테스트하면서 설정해야 합니다.
3. Azure Cloud로 보낼 데이터 설정
void setTelemetryValue(String name, int value) ;
void setTelemetryValue(String name, float value) ;
void setTelemetryValue(String name, double value) ;
void setTelemetryValue(String name, bool value) ;
void setTelemetryValue(String name, const String& value) ;
void setTelemetryValue(String name, JsonVariant value) ;
동일한 함수명으로 오버로딩 되어 있습니다. String으로 name을 쓰고 거기에 맞는 데이터 타입의 변수를 넣으면 됩니다.
name과 type은 AzureIoTCentral에 사용하는 템플릿의 name과 type과 맞아야 정상적으로 데이터가 업로드됩니다.
bool sendMessage() ; //데이터를 셋팅하고 보내기
4. KeyLock, KeyUnlock 제어명령 처리 구문
iot.addCommandHandle(
"KeyUnlock", [](String payload) { // Add handle 'KeyUnlock' command
int valueInt =
payload.toInt(); // Convart payload in String to Number (int)
servoDown();
delay(1000);
Serial.println("KeyUnlock");
iot.setTelemetryValue("KeyStatus", false);
if (iot.sendMessage()) {
Serial.println("Send Response");
} else {
Serial.println("Send Response error!");
}
});
iot.addCommandHandle(
"KeyLock", [](String payload) { // Add handle 'KeyLock' command
int valueInt =
payload.toInt(); // Convart payload in String to Number (int)
servoUp();
delay(1000);
Serial.println("KeyLock");
iot.setTelemetryValue("KeyStatus", true);
if (iot.sendMessage()) {
Serial.println("Send Response");
} else {
Serial.println("Send Response error!");
}
});
Azure 클라우드에서 해당 명령을 받았을때 처리하는 부분입니다. 다양한 명령을 추가하려면 위 형식으로 처리합니다.
payload.toInt() 이 부분은 명령에 따라오는 payload가 있을때 각각의 데이터타입에 맞춰서 변환해 주는 부분입니다.
KeyLock, KeyUnlock에서 사용하지는 않지만 다른 명령을 처리하려는 분들을 위해 남겨 두었습니다.
5. ESP32 서보모터 라이브러리 다운로드이외에 아두이노 설정은 아래글을 참고하시기 바랍니다. (ESP32 2.0.0설치, 배선도 관련)
https://codezoo.tistory.com/40추가로 코드를 보면 아시겠지만, 서보모터는 27번핀, 전원은 5V를 연결했고
배터리 ADC는 25번핀에 연결했습니다.
6. azure 클라우드 서비스 연결 유지
아래 메인 loop문에서 디바이스가 azure 클라우드에 연결여부를 체크해서 연결 되어 있지 않으면 자동 연결 합니다.
void loop() {
if (iot.isConnected()) { // 연결되어 있지 않으면
iot.loop();
...
} else {
Serial.println("iot Connect Ready...");
iot.connect(); // azure 클라우드 연결
Serial.println("iot Connect Complete!");
}
delay(1);
}
다음은 Azure IoT Central 설정 입니다. 이미 Azure 클라우드 서비스에 가입하셨다는 전제에서 템플릿 제작, 디바이스 생성방법에 대해서 알려 드리겠습니다.
먼저 만들어진 서비스의 모습 입니다.
현재 커넥티드 자동차 Door 상태 (마지막 설정상태)와 배터리 모니터링 상태가 Overview에 나타납니다.다음은 Commands 화면 입니다. KeyUnlock, KeyLock 아래 있는 Run버튼을 누르면 디바이스로 실시간 명령이 전달됩니다.
이제 AzureIoTCentral에서 직접 구현해 보도록 하겠습니다.
일단 가격 정책 입니다.일단 눈에 확 들어 오는 부분은 2개의 디바이스 800개 메시지까지는 무료라는 내용입니다. Standard Tier0로 선택할 경우입니다. 자동차가 2대 이상인 분들은 별로 없으실 것 같아서 편하게 테스트 가능할 것 같습니다.
이제 만들어 보겠습니다.아쉽게도 AzureIoTCentral은 local서비스가 불가능합니다. 가장 가까운곳이 일본이라 Japan East를 선택했습니다.
가격정책은 아까 확인한 Standard 0를 선택했습니다. Template를 Custom application으로 선택한 이유는 내가 원하는 폼으로 제작하기 위해서입니다. Review + create를 누릅니다.만드는데 시간이 좀 걸립니다. 기다립니다.
오른쪽에 있는 주소에 주목 합니다. IoT Central Application URL인데, 이 주소를 웹 App이 생성되어 있으므로 이 주소로 접속해서 PC 또는 모바일에서 연결된 자동차를 다룰 것입니다.
만들어진 이름의 URL로 이동 합니다. 먼저 디바이스 템플릿을 제작하겠습니다.디바이스 템플릿 이름을 지정합니다. 아까 위에서 만든 smartkey로 지정했습니다. 다음을 누릅니다.
이제 사용자 지정 모델을 만듭니다.
View는 일단 만들어 두고 나중에 아래와 같이 업데이트했습니다. Key 상태와 Battery 상태를 각각 아래의 차트로 설정했습니다.
준비가 되었으면 이제 배포(Publish) 합니다.
템플릿 제작이 완료 되었으니 이제 디바이스를 생성하도록 하겠습니다.
이전에 만들어 둔 smartkey 템플릿을 불러와서 Create 합니다.
만들어진 Device name과 Device template를 확인합니다. Device name 아래에 있는 smartkey를 클릭합니다.
Commands 화면도 확인해 봅니다.
이제 마지막 입니다. 실제 자동차에 설치된 Real Device에서 위 클라우드 디바이스에 연결할 정보를 얻어 오도록 하겠습니다. 위 Connect 버튼을 누르면 나오는 팝업창에 있는 ID scope와 Device ID, Primary key (or Secondary key) 정보를 디바이스 펌웨어 코드에 넣습니다.
이제 구성이 완료 되었습니다. 디바이스를 구동 후 azure iot central application url로 접속하면 아래와 같은 접속정보와 제어화면을 만날 수 있습니다.
디바이스 ID가 smartkey로 시작하다가 마지막에 CarGateWay로 변경되었는데, 작업을 진행하면서 smartkey 디바이스를 하나 만들고 추가로 CarGateWay를 만들었기 때문입니다. 현재 두 개를 운영하고 있는 상태입니다.
차량에 설치하여 필드 테스트 진행하고 있습니다.
1. 코란도 투리스모2. 그랜저 IG
마치며,
현재는 커넥티드 자동차의 도어락, 언락 기능만 구현되어 있지만, 위 방식에 익숙해지시면 다양한 센서와 액츄에이터를 연결해서 기능을 확장하실수 있습니다. 해당 프로젝트를 좀 더 확장해서 함께 진행하고자 하시는 분들이 있으셔서 관련 소식은 추후에 다시 전해 드리도록 하겠습니다.
Murata Type1SC 모듈 구매, 자료 관련 문의
(주)아성코리아
전지만 이사 010-5418-8812 mlcc@asung.com
박상인 수석 010-6556-5405 sipark@asung.com
LTE-CATM1 내장형 모뎀 대량 구매 상담, 외주 개발, 협업 문의
(주)코드주
장병남 대표 010-8965-1323 rooney.jang@codezoo.co.krhttps://www.devicemart.co.kr/goods/view?no=14077527
https://smartstore.naver.com/codezoo/products/7153689192
'Azure IoT' 카테고리의 다른 글
Azure IoT Hub와 LTE CATM1 내장형 모뎀 연결하기 (0) 2022.11.09