'breakout'에 해당되는 글 2건

  1. 2017.10.12 Hardware | VL53L0X 레이저 거리 측정 센서 사용해 보기 8
  2. 2017.09.05 Hardware | NEO-6M GPS 를 구동해 보자 2

Hardware | VL53L0X 레이저 거리 측정 센서 사용해 보기

|

1. 드론


드론 제작시 필요한 sensor 중에 하나는 거리 측정기 라고 합니다.

이는 호버링이나 일정한 높이를 유지하면서 이동시, 항상 지상의 높이를 측정하여 자기의 위치를 알아야 하니까요.


또한 충돌 방지등에도 필요할 것 같습니다.



드론이 보는 시각은 향후 이렇게 되겠죠?





2. 주문


항상 그렇듯 AliExpress 에서 검색하여 주문하였습니다.


정식 명칭은,

"VL53L0X,Time-of-Flight (ToF) Laser Ranging Sensor Breakout 940nm GY-VL53L0XV2 Laser Distance Module I2C IIC" 입니다.


https://ko.aliexpress.com/item/VL53L0X-Time-of-Flight-ToF-Laser-Ranging-Sensor-Breakout-940nm-GY-VL53L0XV2-Laser-Distance-Module-I2C/32773306734.html



여러가지 breakout 보드가 존재하지만, 이 제품이 고정홀이 2개이고 가장 저렴해서 선택했습니다.




3. 도착


도착샷들 입니다.

AliExpress 제품답게 포장되어 왔습니다. Gift 표시가 빠지면 섭섭하지요.



레이저를 쏘는 소자 부분입니다.



뒷면은 신호처리에 필요한 회로로 구성되어 있습니다.





4. Layout


Pin 연결 정보 입니다.


  VL53L0X | Arduino Nano
-------------------------
    VIN   |     3.3V
    GND   |     GND
    SCL   |     A5
    SDA   |     A4
-------------------------



I2C를 사용하는지라, SSD1306 연결과 완벽하게 동일합니다.


  SSD1306 | Arduino Nano
-------------------------
    VCC   |     3.3V
    GND   |     GND
    SDC   |     A5
    SDA   |     A4
-------------------------


구성도는 다음과 같습니다.





5. VL53L0X sketch


Adafruit 용 VL53L0X library 를 다운로드 받아 libraries 폴더에 카피합니다.


* Adafruit VL53L0X library

https://github.com/adafruit/Adafruit_VL53L0X


#include "Adafruit_VL53L0X.h"

Adafruit_VL53L0X lox = Adafruit_VL53L0X();

void setup() {
	Serial.begin(115200);
	
	// wait until serial port opens for native USB devices
	while (! Serial) {
	delay(1);
	}
	
	Serial.println("Adafruit VL53L0X test");
	if (!lox.begin()) {
	Serial.println(F("Failed to boot VL53L0X"));
	while(1);
	}
	// power 
	Serial.println(F("VL53L0X API Simple Ranging example\n\n")); 
}


void loop() {
	VL53L0X_RangingMeasurementData_t measure;
	
	Serial.print("Reading a measurement... ");
	lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout!
	
	if (measure.RangeStatus != 4) {  // phase failures have incorrect data
	Serial.print("Distance (mm): "); Serial.println(measure.RangeMilliMeter);
	} else {
	Serial.println(" out of range ");
	}
	
	delay(100);
}


I2C detector 로 확인해 보면 VL53L0X 의 기본 address 인 "0x29" 이라는 것을 확인할 수 있습니다.


#include "Wire.h"
#include "i2cdetect.h"
 
void setup() {
    Wire.begin();
    Serial.begin(9600);
    Serial.println("i2cdetect example\n");
    Serial.print("Scanning address range 0x03-0x77\n\n");
}
 
void loop() {
    i2cdetect(); // default range from 0x03 to 0x77
    delay(2000);
}




6. VL53L0X + OLED


SSD1306 OLED sample sketch 도 있어서 실행하면 에러를 냅니다.

원인은 library source 가 다른것.



특이하게도 Adafruit sample 에 vl53l0x_oled 라고 되어 있음에도 불구하고,

pololu 제작자가 만든 library 를 다운로드 받아서사용해야 합니다.


* VL53L0X library

https://github.com/pololu/vl53l0x-arduino


/* This example shows how to use continuous mode to take
range measurements with the VL53L0X. It is based on
vl53l0x_ContinuousRanging_Example.c from the VL53L0X API.

The range readings are in units of mm. */

#include "Wire.h"
#include "VL53L0X.h"
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"

Adafruit_SSD1306 display = Adafruit_SSD1306();

VL53L0X sensor;

void setup()
{
	Serial.begin(9600);
	
	display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
	// init done
	display.display();
	delay(1000);
	
	
	Wire.begin();
	
	sensor.init();
	sensor.setTimeout(500);
	
	// Start continuous back-to-back mode (take readings as
	// fast as possible).  To use continuous timed mode
	// instead, provide a desired inter-measurement period in
	// ms (e.g. sensor.startContinuous(100)).
	sensor.startContinuous();
	
	// text display big!
	display.setTextSize(4);
	display.setTextColor(WHITE);
}

void loop()
{
	uint16_t reading = sensor.readRangeContinuousMillimeters();
	
	if (reading > 8000) {
		display.display();
		display.clearDisplay();
		return;
	}
	
	Serial.print(sensor.readRangeContinuousMillimeters());
	if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
	
	display.clearDisplay();
	display.setCursor(0,0);
	display.print(reading);
	display.print("mm");
	display.display();
	Serial.println();
	delay(50);
}


이번에는 OLED 를 추가하였으므로, I2C detector 로 확인해 보면 아래와 같이 "0x3c" 가 추가적으로 검출된 것을 알 수 있습니다.

속도는 좀 느릴지 모르지만, address 를 따로 가지고 있어서 동시에 같은 pin 연결을 할 수 있는 I2C 의 강점인것 같습니다.


* 참고 글

http://chocoball.tistory.com/entry/Hardware-SSD1306-128x64-monochrome-OLED





7. 결과


VL53L0X 센서만 부착하여 "Serial Monitor" 로 확인한 내용입니다.



아래는 OLED 를 부착하여 측정한 내용입니다.

15Cm 자를 쟀는데, 20Cm 언저리가 나오네요. 뭔가 칼리브레이션이 필요한 듯 보입니다.



왔다갔다 하면서 측정해 봤습니다.

역시 5Cm 정도가 이미 + 가 되어 있네요. 조정이 초기에는 필요한것 같습니다.



센서부를 찍어봤습니다.

맨눈으로는 보이지 않지만, 감도가 좋은 스마트폰 카메라에는 센서에서 나오는 불빛이 보입니다.

아마도 레이저겠죠?





FIN


잘만 사용하면 요긴하게 쓰일 수 있을것 같습니다.

애들 키 재는 용도로도 쉽게 만들 수 있을것 같네요.

And

Hardware | NEO-6M GPS 를 구동해 보자

|

1. GPS


우리 생활에 이제는 필수가 된 GPS.

모바일 기기라면 이제 GPS 는 어디든 달려 있는 시대 입니다.



이게 Arduino 용의 breakout board 로 나와 줬네요.

센서에 목말라 있는 저로써는 꼭 구동해 보고싶은 센서 입니다.





2. 주문


AliExpress 에서 검색해 보면, 대략 3가지 제품으로 나뒵니다.

- Drone 용 소형 GPS : NEO-M8N

- 저가용 GPS : NEO-6M

- 그 외 안테나, 연장선 등의 부품


대략 저가용 GPS 인 NEO-6M 을 빼면, NEO-M8N 인데, 1만원이 넘어가는 나름 고가 센서가 됩니다.

우선 구동만을 확인해 볼 예정이므로, NEO-6M 을 구입합니다.


* NEO-6M 본체


https://ko.aliexpress.com/item/2pcs-lot-GY-NEO6MV2-new-GPS-module-with-Flight-Control-Flight-Control-EEPROM-MWC-APM2-5/1811853522.html



6천원 정도면, 밥 한끼 정도의 가격이므로, 취미의 즐거움을 위해 희생해 봅니다.


구입은 Arduino 취미를 시작한 작년 말에 구입했지만,

정작 사용해 보기까지는 시간이 걸렸습니다.


그 이유는 달려있는 안테나가 너무 짧아, 연장선을 구입하고, 다른 센서가지고 놀면서 늘어졌습니다.

GPS 는 좀 진득하게 사용해 봐야 할 것 같았거든요.



* 안테나 연장


https://ko.aliexpress.com/item/2016-New-GPS-Active-Remote-Antenna-Aerial-Connector-1575-42MHz-SMA-connector-For-3M/32616362445.html


PC 에 연결하여 확인하려면 외부로 가지고 나가야 하는데, laptop 이 필수 입니다.

구동 완료가 될 때까지 매번 밖에 나갈 수는 없으므로 연장 안테나를 구입합니다.



* 커넥터


https://ko.aliexpress.com/item/RF-pigtail-jumper-cable-6in-6-IPX-IPEX-I-PEX-U-FL-MHF-4-to-SMA/32357824395.html


연장 안테나의 끝 단자인 SMA Male connector 랑 breakout board 와의 연결을 위해,

SMA female connector 를 구입합니다.



다만 여기서 사고가 발생합니다.

바로 breakout board 에 있는 단자 크기를 몰라, 그냥 주문했더니, 맞지 않았습니다.


원래 breakout board 의 안테나 단자를 감싸야 하는데, 그 속으로 들어가버릴 정도로 작았습니다.

구매 사이트 사진에는 MHF-4 도 표시되어 있지만, 사실은 U. FL 규격을 구입해야 했었습니다.



결국 U. FL 규격의 SMA female 단자도 나중에 구입하지만,

또 기다려야 하니 좀이 쑤셔서 그냥 진행해 보기로 합니다.




3. 도착


도착은 3주정도 걸린 듯 합니다.



구성품은 NEO-6M breakout board 와 U. FL 커넥터가 달린 안테나 로 되어 있습니다.



여기에 문제의 "SMA female : MHF-4" 점퍼 입니다.



배송은 참 잘 왔습니다.



MHF-4 connector 는 WIFI 모듈에 자주 쓰이는 규격이라 아니, 나중에 또 쓸 일이 있겠죠?



판매자의 별 5개 요청 편지.

AliExpress 입점상들도 경쟁이 치열해지고 평가에 의해 매출이 달라지므로 신경을 많이 쓰는것 같습니다.

역시 글로벌로 장사를 하면, 사용자 피드백의 중요함이 사업에 있어서 크리티컬 하다는 것을 알 수 있습니다.


장사꾼들인 중국인들에게는 배울게 많습니다.



연장 안테나 모듀입니다.



배송은 잘 왔습니다.



이쪽 면이 자석으로 되어 있어서 차량이나 난간에 잘 고정이 됩니다.



난간에는 이렇게 설치 되었습니다.

왼쪽의 안테나는 FlightAware 용으로 세워진 안테나 입니다.

http://chocoball.tistory.com/entry/Hardware-PiAware-FlightAware





4. MHF-4


문제의 MHF-4 단자에 대해 살펴보기로 합니다.

구성품으로 달려있던 안테나 단자와 비교샷 입니다.


크기 자체의 차이로 따져 보면, 구성품의 connector 는 "U. FL" 규격으로 보입니다.

자세히 들여다 보면, 중심부에 꽂히는 심의 크기는 양쪽다 (MHF-4 / U. FL) 같아 보입니다.

여기서 착안하여 그냥 사용해 보기로 합니다.



원래는 이렇게 연결해서 사용됩니다.



U. FL 규격으로, breakout board 와 연결된 모습입니다.

외곽 금속을 커넥터가 잘 감싸 줘서 확실하게 고정이 되는 구조입니다.

이렇게 연결하면 손톱으로 튕기지 않는 한, 잘 붙어 있습니다.



SMA female : MHF-4 규격의 점퍼와 연결한 모습입니다.

Breakout 보드쪽 커넥터의 외경이 점퍼 외경을 반대로 감싸는 구조가 됩니다.

전기적 신호는 문제 없겠지만, 많이 헐겁습니다. 조금만 힘이 가해져도 금방 분리가 되어 버립니다. (진행하면서 가장 스트레스)



다시 주문한 "SMA-female : U. FL" 단자는 아직 도착하지 않았지만,

아래 구성처럼 연결하여 진행합니다.





5. Arduino 와 연결


Pin 들을 납땜해서 사용해도 되지만, 향후 어떤 보드에 실장하게 될 지 모르는지라,

납땜하지 않고 Probe Clip 을 이용하여 연결합니다.


Probe Clip 에 대해서는 다음 link 를 참조해 주세요.

http://chocoball.tistory.com/entry/Hardware-Probe-Clip



Arduino 와 연결된 모습입니다.





6. Layout


Pin 연결 정보 입니다.


    NEO-6M   | Arduino Nano
----------------------------
     VCC     |     3.3V
     RX      |     D9
     TX      |     D10
     GND     |     GND
----------------------------


보드 연결선은 다음과 같이 하면 됩니다.





7. Libaray 및 Sketch


여기서부터는 아래 사이트를 참고 하였습니다.


http://www.instructables.com/id/How-to-Communicate-Neo-6M-GPS-to-Arduino/


사전에 필요한 Library 는 다음 두가지 입니다.

미리 Arduino Library 폴더에 카피해 놓습니다.


* TinyGPS

http://arduiniana.org/libraries/tinygps/

https://github.com/mikalhart/TinyGPS


* SoftwareSerial

https://cdn.instructables.com/ORIG/F8C/OHR4/IVHQK4BI/F8COHR4IVHQK4BI.rar


위의 두 Library 가 준비되었다면, 아래 sketch 를 업로드해서 구동시킬 수 있습니다.


/*********************
 *10 to GPS Module TX*
 *09 to GPS Module RX*
 *********************/

#include "SoftwareSerial.h"
#include "TinyGPS.h"

SoftwareSerial mySerial(10, 9);
TinyGPS gps;

void gpsdump(TinyGPS &gps);
void printFloat(double f, int digits = 2);

void setup() {
	// Open serial communications and wait for port to open:
	Serial.begin(9600);
	// set the data rate for the SoftwareSerial port
	mySerial.begin(9600);
	delay(1000);
	Serial.println("uBlox Neo 6M");
	Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
	Serial.println("by Mikal Hart");
	Serial.println();
	Serial.print("Sizeof(gpsobject) = "); 
	Serial.println(sizeof(TinyGPS));
	Serial.println(); 
}

void loop() // run over and over
{
	bool newdata = false;
	unsigned long start = millis();
	// Every 5 seconds we print an update
	while (millis() - start < 5000) {
		if (mySerial.available()) {
			char c = mySerial.read();
			//Serial.print(c); // uncomment to see raw GPS data
			if (gps.encode(c)) {
				newdata = true;
				break; // uncomment to print new data immediately!
			}
		}
	}
  
	if (newdata) {
		Serial.println("Acquired Data");
		Serial.println("-------------");
		gpsdump(gps);
		Serial.println("-------------");
		Serial.println();
	}
}

void gpsdump(TinyGPS &gps) {
  long lat, lon;
  float flat, flon;
  unsigned long age, date, time, chars;
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned short sentences, failed;

  gps.get_position(&lat, &lon, &age);
  Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon); 
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
  
  // On Arduino, GPS characters may be lost during lengthy Serial.print()
  // On Teensy, Serial prints to USB, which has large output buffering and
  //   runs very fast, so it's not necessary to worry about missing 4800
  //   baud GPS characters.

  gps.f_get_position(&flat, &flon, &age);
  Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
    Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  gps.get_datetime(&date, &time, &age);
  Serial.print("Date(ddmmyy): "); Serial.print(date); Serial.print(" Time(hhmmsscc): ");
    Serial.print(time);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  Serial.print("Date: "); Serial.print(static_cast(month)); Serial.print("/"); 
    Serial.print(static_cast(day)); Serial.print("/"); Serial.print(year);
  Serial.print("  Time: "); Serial.print(static_cast(hour+8));  Serial.print(":"); //Serial.print("UTC +08:00 Malaysia");
    Serial.print(static_cast(minute)); Serial.print(":"); Serial.print(static_cast(second));
    Serial.print("."); Serial.print(static_cast(hundredths)); Serial.print(" UTC +08:00 Malaysia");
  Serial.print("  Fix age: ");  Serial.print(age); Serial.println("ms.");

  Serial.print("Alt(cm): "); Serial.print(gps.altitude()); Serial.print(" Course(10^-2 deg): ");
    Serial.print(gps.course()); Serial.print(" Speed(10^-2 knots): "); Serial.println(gps.speed());
  Serial.print("Alt(float): "); printFloat(gps.f_altitude()); Serial.print(" Course(float): ");
    printFloat(gps.f_course()); Serial.println();
  Serial.print("Speed(knots): "); printFloat(gps.f_speed_knots()); Serial.print(" (mph): ");
    printFloat(gps.f_speed_mph());
  Serial.print(" (mps): "); printFloat(gps.f_speed_mps()); Serial.print(" (kmph): ");
    printFloat(gps.f_speed_kmph()); Serial.println();

  gps.stats(&chars, &sentences, &failed);
  Serial.print("Stats: characters: "); Serial.print(chars); Serial.print(" sentences: ");
    Serial.print(sentences); Serial.print(" failed checksum: "); Serial.println(failed);
}

void printFloat(double number, int digits) {
	// Handle negative numbers
	if (number < 0.0) {
		Serial.print('-');
		number = -number;
	}

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i 0)
    Serial.print("."); 

  // Extract digits from the remainder one at a time
  while (digits-- > 0) 
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    Serial.print(toPrint);
    remainder -= toPrint;
  }
}





8. 구동


실제 구동 영상입니다.

신호를 받기 시작하면 GPS의 LED 도 깜빡이면서 구동되고 있다는 것을 알 수 있습니다.



Arduino IDE 의 Serial Monitor 에서 아래와 같은 정보가 스크롤 됩니다.



정보를 보면 제대로 GPS 위성과 통신을 하는 것 같습니다.

확실히 베란다 난간에 GPS 안테나를 붙이니 정보를 잘 받네요.





FIN

일상 생활에서 GPS는 필수 기기 입니다.

눈에 보이지 않았던 중간 단계를 확인할 수 있어서 좋았습니다.





Update

"SMA Female - U. FL" 어뎁터가 도착했습니다.


딱 봐도 굵기가 다릅니다.

역시 신호와 전류는 두꺼운게 좋습니다.



커넥터 부분을 비교해 봤어요.

제일 밑에가 부속으로 딸려 있던 안테나, 중간이 잘못 구입한 MHF-3 규격, 윗부분이 새로 구입한 U. FL 규격 사진입니다.



전체 비교샷 입니다.



NEO-6M 에 바로 결속해 봤습니다.

딱 맞습니다. 손톱으로 의도적으로 뜯지 않는 한, 튼튼하게 결속되어 있습니다.



And
prev | 1 | next