'gnuplot'에 해당되는 글 2건

  1. 2020.06.23 Hardware | Raspberry Pi 4 알루미늄 케이스 구매기
  2. 2019.08.10 Hardware | Digital Compass - HMC5883L 사용기 - 3

Hardware | Raspberry Pi 4 알루미늄 케이스 구매기

|

Raspberry Pi 4 가 작년 말쯔음 새로 출시되었습니다.

초반에는 물건을 구할 수 없어서 참고 있다가, 이번 전직하면서 기분 전환할 겸, 중고로 조금 저렴하게 구하게 되었습니다.


* Hardware | Raspberry Pi 4 Model B 4GB 버전 구매기

https://chocoball.tistory.com/entry/Hardware-Raspberry-Pi-4-4GB-buy


이번 버전은 가장 성능 좋은 CPU 를 가졌지만, 그 만큼 전력도 많이 먹는지라 발열이 심합니다.

쾌적한 쿨링을 위해, 항상 구매하던 Wicked Aluminum (가족 비지니스라고 하더군요) 에서 통짜 알루미늄 케이스를 구입 했습니다.




1. Raspberry Pi 4 케이스


Raspberry Pi 1 과 2 를 구입했을 때 부터 아래 사이트에서 판매하는 통 알루미늄 케이스를 구입해서 사용해 왔습니다.

CPU / RAM 등에 케이스가 직접 접촉하여, 캐이스 전체가 열을 발산해 주는 방식 입니다.


케이스 바디가 자체가 heat-sink 가 되는 방식이라 팬이 추가로 필요 없고 passive heat-sink 역할을 해 줍니다.

이 만큼 완성도 있고, 멋있는 라즈베리파이용 케이스는 못 봤습니다.


* Wicked Aluminum

https://wickedaluminum.com/




두근두근.




2. Open Shield 대응용 버전


지금까지는 라즈베리 파이를 전부 감싸는 형태를 구입했지만, 이번에는 GPIO 및 카메라 슬롯이 노출된 버전을 구입해 보기로 합니다.


* Raspberry Pi 4 OPEN SHIELD Case with Heat Dissipation

https://wickedaluminum.com/collections/frontpage/products/raspberry-pi-4-open-shield-case-with-heat-dissipation



Raspberry Pi 용 Shield 를 구입해도 상판을 분리하거나 케이블을 이용해서 연장할 필요 없이 바로 장착할 수 있게 만들어 졌습니다.

디자인의 혁신이 계속 이루어 지고 있는, 이 회사를 저는 지지합니다.



상판이 Shield 장착을 위해 반으로 잘려 기존의 통구리 부피가 반으로 줄었지만, 온도 방어가 어느정도 되는지 궁금해 지네요.




3. 내 돈...

본체 가격이 70 USD, 배송비 25 USD 여서 거의 100 달러가 필요합니다. 10만원 이상... ㅠㅠ

가족이 경영하는 family business 라서 그런지 가격에 자비가 없습니다. 아니 본체보다 더 비싸.



그 간 internet performance 리소스를 제공하여 모아 두었던 돈을 이번에 사용하기로 합니다. (지금은 없어진 서비스)


* Software | Gomez Peer 의 서비스 종료

https://chocoball.tistory.com/entry/Software-Gomez-Peer-retirement


* Linux | Gomez Peer arbeit

https://chocoball.tistory.com/entry/Linux-Gomez-Peer-install


이번에도 returning 고객이 됩니다. 벌어 놓은 것은 몇 년치 이지만, 한방에 없어지는 군요.



고민따위 할 순간도 없이, 순식간에 결제가 완료되고, 배송을 기다리게 됩니다.





4. 도착

USPS 를 통해 배달되어 왔습니다.

배송 현황이 일본에서 출발한게 언제인데 인천까지 도착하는게 10일 넘게 걸리고, tracking 정보는 꼬여 있습니다.

이놈들 DB 정렬 작업도 안하는 듯. 인터넷에 보니, USPS 원성은 자자 하더군요. 주문한지 1달만에 도착했습니다.


웃긴건 이게 무려 "First-Class Package International Service" 라는 것. 지금 확인해 보니, 아직도 도착하지 않는 것으로 뜨네요.



포장은 무난.



그냥 통 알루미늄 덩어리 이다 보니, 간단하게 포장되어 왔습니다.



구성품이 레핑으로 쌓여져 왔습니다. 중간의 신문지는 배송 중 스크래치 방지용.



이번에 구입한 버전은 GPIO 를 노출시켜야 하므로, 상판 두께가 반으로 줄었습니다.





5. 내용물

제품의 메인인 케이스 덩어리들 입니다. RPi 4B Standard Bottom / RPi 4B Open Shield Top 이라고 각인이 새겨져 있네요.



하판은 기존 제품과 크게 달라진 점은 없어 보입니다.



완전 클리어 광을 내도 될 듯 한데, 궂이 그러지 않고 러프한 표면을 유지하겠다는 바닥면.



상판.



GPU, RAM, CPU 를 접촉하는 부분이 튀어 나와 있습니다.



그 외, 시리콘 그리스, 나사, 완충 쿠션, 절연 플라스틱, 전열 테이프, 클리어 다리, 등이 포함되어 있습니다. 





6. 일반 방열판 쿨링 효과

쿨링 효과를 비교하기 위해, 아래와 같은 순으로 온도를 측정해 봤습니다.

- CPU 에 방열판 붙이지 않고 측정

- 낮은 구리 방열판

- 높은 구리 방열판

- Wicked Aluminum case


Raspberry Pi OS 의 명령어는 다음과 같습니다.


$ vcgencmd measure_temp


우선 CPU 에 방열판을 붙이지 않은 채로 노출시켜서 측정해 봤습니다.



집에서 굴러다니던 통구리 방열판을 붙여 봤습니다.



바로 53도에서 47도로, 6도가 떨어지는 군요.



통구리 방열판 중, 높이가 있으면서 바람 흐름이 좋게 설계된 좀더 고급 방열판을 붙여 봅니다.



초반에는 낮아지는 듯 했으나, 결국 방열판이 없는 상태와 비슷한 온도로 되돌아 옵니다.

이는, 온도를 받아주는 mass 가 동일하게 달구어 지므로, 별도의 쿨링팬이 없는 상황에서는 비슷한 결과가 나올 듯 합니다.

다만, 방열판이 없을 때 보다 2~3도 정도는 낮습니다.





7. Wicked Aluminum case 효과

두둥~! Wicked Aluminum 케이스를 장착합니다.



GPU, RAM, CPU 가 맞닿을 위치에 써멀 구리스를 발라 주구요.



뚜껑을 한번 닫았다가 분리하여, 써멀 구리스의 도포 정도를 확인해 봅니다. 한방에 완벽하군요!



나사를 조여주면 장착 완료.



효과는 대단. 그냥 34도 찍습니다. 53도 > 34도면 거의 20도 차이가 나는군요. 실내 온도는 24도 정도였습니다.



SSH 로 접속하여 부하를 주고 연석으로 확인해 봤습니다. 40도는 잘 안넘어가네요.





8. 여러가지 확인

Raspberry Pi 의 CPU 는 얼마가 적정 온도일까요?


* What is the maximum / minimum operational temperature?

https://raspberrypi.stackexchange.com/questions/103/what-is-the-maximum-minimum-operational-temperature


The Raspberry Pi is built from commercial chips which are qualified to different temperature ranges; the LAN9512 is specified by the manufacturers being qualified from 0°C to 70°C, while the AP is qualified from -40°C to 85°C.


70도 이하군요. 50도 정도까지는 특별히 문제 없을 듯 합니다.

gnuplot 이라는 graph 분석툴을 가지고 시계열 그래프를 그려주는 어플을 활용하는 방법이 나와 있어서 사용해 봅니다.

# gnuplot install
sudo apt install gnuplot


구동할 스크립트는 다음과 같습니다.

#!/bin/sh
echo $(date +%s ; cat /sys/class/thermal/thermal_zone0/temp) | tee >> temperature.plot


위의 스크립트를 저장했으면, 구동할 수 있도록 파일 속성을 변경하고 watch 를 돌립니다.


# linux command
chmod +x temperature.sh
nohup watch ./temperature.sh &


output 된 결과를 가지고 그래프를 그려보면 아래와 같이 보여줍니다. (What a brilliant !!!)

gnuplot -e "set terminal dumb $(tput cols) $(tput lines);plot 'temperature.plot' using 0:2 with lines"


구동되는 스크립트를 중지하려면 killall 로 종료.


killall watch


너무 이쁘다... ㅠㅠ 마지막 부분이 꺾인 것은, 선풍기 바람을 10초 정도 쏘여 봤습니다.

대략 40도 근처에서 쿨링팬 없이 Raspberry Pi 4 4GB 를 운용 가능합니다.



매우 비싼 통알루미늄 케이스지만, 만족도는 최고네요.



FIN




Update - 202020712


송장 종이를 기록을 위해 올려 놓습니다.



And

Hardware | Digital Compass - HMC5883L 사용기 - 3

|

이 글은 전편 2개가 있습니다.


* Hardware | Digitial Compass - HMC5883L 사용기 - 1

https://chocoball.tistory.com/entry/Hardware-Digital-Compass-HMC5883L-1


* Hardware | Digital Compass - HMC5883L 사용기 - 2

https://chocoball.tistory.com/entry/Hardware-Digital-Compass-HMC5883L-2





1. Why calibration?


이 HMC5883L 이나, 기타 digital compass 는 영점조정이 필요합니다.

Calibration 을 하기 전은 정확성에 있어서 사용할 수 있는 물건이 아니라고도 할 정도 입니다.


또한 지구상에서 내가 어디에 있느냐에 따라 자력의 방향과 세기가 달라지므로, 공장에서 만들어 졌던 들,

이 영점 조정은 꼭 필요하게 된다는 이야기가 됩니다.


현재 위치하고 있는 지리적 장소에 따라 변하는 자력을 계산해 주는 사이트도 있습니다.


* NCEI Geomagnetic Calculators

https://www.ngdc.noaa.gov/geomag/calculators/magcalc.shtml






2. Yury Matselenak


아래 그림처럼 직각 육면체 (박스) 를 이용하여 영점 조정한 사람이 있습니다.


* Advanced hard and soft iron magnetometer calibration for dummies

https://diydrones.com/profiles/blogs/advanced-hard-and-soft-iron-magnetometer-calibration-for-dummies



영점 조절을 위한 arduino code, Visual Studio 2010 C# 을 이용한 검증 어플 및 계산 어플까지 all set 를 혼자 만드신 분이죠.

위의 블로그에서 가져온 소스를 여기에 올려 놓습니다.


MagMaster.rar


위의 압축파일에 모든게 들어 있습니다만,

한가지 아쉬운 것은, 2014년에 만들어진 코드라, 최신 Arduino IDE 에서는 제대로 동작하지 않습니다.

동작만 한다면, 이 분이 안내하고 만들어진 프로그램을 사용하여 영점 조정이 가능하나, 그러지 못했네요.


시간이 생기면 소스를 분석하고, geomagnetic 에 대해 공부하여 소스 개선을 좀 해주고 싶으나, 현재 그럴 여유는 없습니다.


Yuri 아저씨의 방식을 잠깐 설명해 보면, HMC5883L 센서는, PCB에 프린팅 된 XYZ 축의 모양에 따라 다음과 같은 축을 가집니다.



이 센서를 가지고 다음과 같이, 북쪽을 0도로 정하고 3차원 공간에서 XYZ 값을 가져오면, 틀어진 중심점을 알 수 있으니,

측정시에 그 틀어진 만큼을 빼주거나 더해주면 된다는 이론 입니다.



모두 12가지를 측정하여, 그 값들을 가지고 틀어진 중심점을 구하는 방식 입니다.





3. Sequential Quadratic Programming


측정된 값을 가지고 SQP (Sequential Quadratic Programming) 을 통해 최적의 영점을 잡아주는 방식도 있습니다.

(보다 기술적인 것은 잘 모름)


본 방식은, 아래 블로그에서 소개되었습니다.


* 電子コンパスHMC5883Lのキャリブレーションに挑戦

http://tomoto335.hatenablog.com/entry/arduino/HMC5883L


결과적으로 SQP 를 실행해야 하는데, 이를 Octave (상용 MatLab 의 GNU 버전) 을 통해서 답을 구할 수 있다고 하네요.

Yuri 아저씨 방식이 안되니, 이 방식으로 진행해 봅니다.





4. Octave


SQP 계산을 위해, 일단 Octave 를 설치해 봅니다.


* GNU Octave

https://www.gnu.org/software/octave/



사용하는 OS 에 맞게 다운로드 하구요.



인스톨 실행파일을 실행 시킵니다.



나에게 맞게 설정하구요.

저는 바탕화면이 지저분하게 되는게 싫어서 "Install for all users" 만 선택했습니다.

BLAS library 는 뭔지 모르니 그냥 OpenBLAS 로 놔뒀습니다.



Windows 10을 새로 깔았더니만 JRE 가 없네요. Octave 는 JRE 가 필요하다 합니다. 깔아 줍니다.



자 이제 다음으로 넘어갑니다.





5. 연결


우선 arduino 와 HML5883L 을 다음과 같이 연결합니다.


 HMC5883L | Arduino Nano
-------------------------
    VCC   |      5V
    GND   |      GND
    SCL   |      A5
    SDA   |      A4
-------------------------


그리고 I2CScanner / I2Cdetect 를 이요하여 address 0x1E 를 통해서 잘 인식 되었는지 확인합니다.



     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 1e --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --


Hardware 준비는 끝났으니, arduino source 준비로 넘어갑니다.





6. 값을 입력받자


HMC5883L 을 구동시켜 주는 몇 가지 Library 들을 확인해 봤는데, Adafruit 에서 만든 Unified library 가 가장 짱인 것 같습니다.



OS 를 싹 밀었더니만 예전 library 가 다 날라갔네요. 깔끔하게 다시 설치해 줍니다.



바로 실행하면, Octave 에서 계산을 방해하는 문자들이 들어가니 아래와 같이 단순한게 XYZ 값만 입력받게 합니다.


#include "Wire.h"
#include "Adafruit_Sensor.h"
#include "Adafruit_HMC5883_U.h"

/* Assign a unique ID to this sensor at the same time */
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);


void setup(void) 
{
  Serial.begin(9600);
  
  /* Initialise the sensor */
  if(!mag.begin())
  {
    /* There was a problem detecting the HMC5883 ... check your connections */
    Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
    while(1);
  }
  
}

void loop(void) 
{
  /* Get a new sensor event */ 
  sensors_event_t event; 
  mag.getEvent(&event);
 
  /* Display the results (magnetic vector values are in micro-Tesla (uT)) */
  Serial.print(event.magnetic.x); Serial.print(",");
  Serial.print(event.magnetic.y); Serial.print(",");
  Serial.println(event.magnetic.z);
}


그러면 다음과 같은 결과들을 얻을 수 있습니다.


...
-21.82,-9.36,-41.94
-16.45,-8.73,-47.24
-16.45,-8.73,-47.24
-16.45,-8.73,-47.24
-9.64,-6.91,-51.43
-9.64,-6.91,-51.43
-9.64,-6.91,-51.43
-3.55,-4.00,-53.27
-3.55,-4.00,-53.27
-3.55,-4.00,-53.27
2.55,-1.27,-54.18
...


Serial Monitor 의 값들을 카피하여 txt 파일로 하나 만들어 놓습니다. 이게 Octave 에서 사용될 소스 값입니다.


참고로 Yuri 아저씨가 만들어 주신 MagMaster 프로그램 중에, MagViewer 라는게 있습니다.

실행시키면, 입력받을 Serial Port 를 물어보는데, arduino 와 연결된 port 를 지정하면 값들을 읽어와서 3차원 공간에 뿌려 줍니다.



훗, 확실히 틀어져 있군요.



동영상으로도 올려 봅니다. Graph Fetish 인지라, 이런거 보면 사족을 못 씁니다.

마우스로 요리조리 움직일 수 있어서 3차원 공간에서 어떻게 값들이 찍히는지 실시간으로 알 수 있습니다.





7. 영접을 찾아 보자


이제 Octave 에서 SQP 를 시켜 볼 차례 입니다.

Serial Monitor 에서 받은 값들을 파일로 만든 다음, Octave 내에서 아래 command 를 실행 시킵니다.


global points
points = csvread("HMC5883L_org_uncal.txt");
scatter3(points(:,1), points(:,2), points(:,3));


느낌이 예전 GNU Plot 을 사용하는 것이랑 매우 비슷하네요. Command 도 비슷하고.



짜잔~! 3차원으로 찍힌 그림을 그려줍니다. 이는 아까 MegViewer 로 본 모습이기도 합니다.



값들이 모두 입력 되었으니, 틀어진 값을 찾기 위해 SQP 해 봅니다.


function retval = sphere_errors(p, x)
  retval = sqrt( (p(:,1).-x(1)).^2+(p(:,2).-x(2)).^2+(p(:,3).-x(3)).^2).-x(4)
endfunction

function retval = sphere_error(x)
  global points
  retval = sum(sphere_errors(points, x).^2)
endfunction

x0 = [mean(points(:,1)), mean(points(:,2)), mean(points(:,3)), 100]

result = sqp(x0, @sphere_error)


그러면 한참만에 아래 값들이 도출됩니다. 모든 값들에 대해 mash 형태로 계산을 하다 보니, 꽤 시간이 걸립니다.



계산에 의하면, 중심점은 (12.1, -5.9, -7.2) 반경 47.85 라고 나옵니다.

이 값들이 지금까지 찾았던 영점값 되겠습니다.





8. 영접값 적용하여 확인


이제 다시 arduino source 로 돌아와, 위에서 구한 값들을 입력받는 source 에 반영해 줍니다.



중심점이 벗어나 있으니, 그만큼 가감해서, 입력 받을 때, 자동으로 계산되게 해주면 됩니다.


MegViewer 를 통해 어떻게 변했나 확인해 볼까요?



오호이~. 적용이 되어서 둥그런 원 모양과 중심축에 붙어서 값들이 표현되었습니다.

이게 calibration 의 힘이란 말인가... (대박)





9. Further More


사실 저는 이 결과가 썩 마음에 들지 않습니다.


일단, 값을 입력받는 방식 차제를 아래 그림들 처럼 고정된 상태에서 선의 걸리적 거림 없이,

6면체의 각 면과 같이 회전하면서 값들을 받아야, 입력값을 신뢰할 수 있을 것 같았습니다.


Arduino GY-273 HMC5883L Magnetometer Compass Tutorial

http://henrysbench.capnfatz.com/henrys-bench/arduino-sensors-and-input/arduino-gy-273-hmc5883l-magnetometer-compass-tutorial/



위와 같이 하려면, 아래 장치 처럼, 무선모듈을 추가해야 하고, 배터리로 구동시켜야 합니다.


* Tutorial: How to calibrate a compass (and accelerometer) with Arduino

https://thecavepearlproject.org/2015/05/22/calibrating-any-compass-or-accelerometer-for-arduino/



저는 이렇게 연결하고 윙윙 휘둘렀습니다.

그래서 몇 개씩 값이 튀기도 하고...



혹시... 혹시 나중에 기회가 되면, 그땐 위의 전문가들 처럼 해보고 싶네요.


And
prev | 1 | next