2015년 9월 24일 목요일

[번역] 엔지니어의 윤리: 폭스바겐 디젤의 큰 실수 by Brian Benchoff

엔지니어의 윤리: 폭스바겐 디젤의 큰 실수

by Brian Benchoff

매번 아주 빈번하게 - 그리고 대체적으로 최상의 상황 아래 놓여있진 않았을 때 - 공학 분야는 대체적으로 가르치는 순간으로 재워지게 된다.폭스바겐은 최근에 11만대의 디젤 자동차의 배기 가스 테스트를 포함하는 거대한 스캔들에 휘말리게 됐다. 이 문제는 미국에서만 18억달러의 조정으로 VW의 비용 발생하게 할 수 있고 의심할 여지 없이 몇 명 이상의 폭스바겐 고용인의 경력을 끝내게 할 것입니다. 자동차 스캔들의 측면에서, 이것은 "Unsafe at Any Speed(어떠한 속도에서의 불안정)" 보다 훨씬 큰 문제이다. 그리고 이것은 폭발하는 경향이 있는 포드 사의 Pinto보다 큰 문제이다. 이것은 제조업에서 엔지니어링의 역사이고, 공학 윤리에 대한 엄청난 가르침을 받을 만한 순간이다.

디젤과 Clean Air 법률


디젤 엔진의 차량은 유럽과 비교했을 때 미국에서는 훨씬 덜 일반적이고, 이러한 성향은 연료의 가격이나 단순한 선호도처럼 단순한 것이 아니다. 디젤 연료는 동일 부피의 가솔린보다 더 많은 에너지를 포함하고 있다. 달리 말하자면, 갤런 당 더 많은 마일 수로 해석할 수 있다. 이러한 점은 비용 측면에서 기인한 것이지만, 가솔린 엔진은 더 많은 이산화탄소를 배출하는 반면, 디젤 엔진들은 그들의 가스 배출량에 비해 훨씬 더 많은 질소 산화물(NOx)을 배출한다.

디젤 자동차들은 유럽에서 승객용 차량의 1/3을 차지하는 반면, 미국의 도로에서는 드물게 차지하고 있다. 이러한 점이 환경 규제에서 차이를 가져오게 된다. 1970년의 US Clean Air 법률의 소개 이후로, 질소 산화물 배출은 이산화탄소 배출보다 더 엄격한 통제 상태에 놓이게 되었다. 유럽에서 이산화탄소는 질소 산화물보다 더 엄격히 통제되고 있다. 이것은 디젤 자동차가 미국보다 유럽에서 더 대중적인 상황에 대한 규제의 단순한 결과이다.

TDIs 와 West Virginia 대학교


폭스바겐 디젤차량의 판매는 이런 더 엄격한 규정에도 불구하고 지난 몇 년 동안 미국에서 상승 추세에 있어왔다. '깨끗한 디젤'은 산업계의 하나의 목표이고, 유럽의 비영리인 International Council for Clean Transportation는 Wet Virginia 대학교의  Alternative Fuels과 Engine Emissions를 위한 센터(CAFEE)의 연구자들과 교류했다. 어떻게 폭스바겐이 미국 규정에 적합한 디젤 엔진을 생산할 수 있었는지에 대한 질문이 우선순위 목록 중 상위에 있었고, 이 팀은 실 사용 환경에서 Passat, Jetta 그리고 Golf 차량들을 시험하는데 장비가 잘 갖추어져 있었다.

미국 정부에 의해서 요구되는 배기가스 시험 통과에도 불구하고 CAFEE는 이 엔진들이 적합하지 않다는 것을 알아냈다. 이러한 명백한 불일치는 어떻게 디젤 배기가스가 측정되는지를 조사함으로써 명확해 질 수 있었다.  위반 사항에 관한 EPA의 안내문은 차량이 테스트 상황에 있었을 때를 감지하는 'defeat device' 로써 기능하는 몇 줄의 코드에 의해서 이루어 졌다고 설명한다. 전자 제어 장치(ECM)에 설치된 소프트웨어는 "운전대의 위치, 차량의 속도, 엔진의 동작의 지속기간, 그리고 기압등을 포함하는 다양한 입력"들을 읽음으로써 차량이 배기가스 시험이 진행중에 있었는지를 감지하게 된다.이러한 조건에서 ECM은 토크와 질소 산화물 배출량을 떨어뜨리는 다른 'map'을 사용하게 된다. 정상 조건 - 차량이 배기가스에 대한 검사가 진행되지 않을 때 - 하에서 따로 분리된 'map'은 가속, 토크, 혹은 연료 효율을 증가 시키도록 사용된다. CAFEE는 시험 장치를 휴대용으로 조작하여 이것을 판정할 수 있었다. dynamometer위에서 차량의 배기가스를 검사하는 대신, 연구자들은 LA에서 Mount Baldy, 그리고 LA에서 San Diego 등의 Los Angeles 주변을 운행하는 실제 주행 조건에서 그들의 검사를 수행했다.

VW은 그들이 잘못됬다고 인정한다.


CAFEE의 연구는 2014에 완료 되었고, 같은 해의 12월에 폭스바겐은 이러한 이슈를 다루기 위한 자발적인 리콜을 발효했다. 한편으로는, California Air Resources Board (CARB)는 onboard 진단 시스템이 증가 된 배기 가스를 왜 감지하지 못했는지를 조사하기 위해서 추가적인 조사를 수행했다. 이 기간동안, VW은 증가된 배기가스를 설명하는 잠재적인 기술적 문제점들을 제공했다. 이 설명들은 EPA나 CARB에게 충분하지 않았고, 이러한 이슈가 해결되었을 때까지 2016년 모데의 디젤 차량들은 적합성 인증을 부여받지 못하는 결과를 가져왔다. 그리고 나서 폭스바겐은 아주 놀라운 행우를 했었다:  차량이 배기가스 검사될 때를 감지하도록 되어 있는 'defeat device'을 디자인하고 설치 했다고 시인했다.

오늘날  어떠한 점이 우리에게 다가오는가...


VW은 미국 도로에 이 'defeat device'가 ECM에 설치된  400,000 이상의 차량들을 가지고 있다. EPA는 규정에 따르지 않은 각 차량에 $37,500달라 까지 민사처벌을 적용할 수 있다. 이것은 폭스바겐이 180억 달러의 벌금에 직면할 수 있다는 것을 의미한다. 폭스바겐 주식은 지난 몇 일 동안 20% 떨어졌고, 폭스바겐의 CEO에서 최하위 엔지니어까지에 이르는 명령의 모든 체계는 초조해 하고 있다. 폭스바겐은 현재 US Department of Justice에 의해서 조사의 대상이 되고, 이 사안에 대한 의회 청문회가 있을 것이다. 폭스바겐이 자신을 찾을 수 있는 더 나쁜 상황을 상상하기 어렵게 됬다.

엔지니어링에서 윤리


의회의 답변 촉구, DoJ의 조사, 투자자들의 년 수입을 잃게되는 이러한 문제점들에도 불구하고, 우리는 이 사안에 하나의 핵심 사실을 절대 알지 못할지도 모른다: 왜 이 'defeat device'가 지금까지 구현되어 왔는가.

폭스바겐 혹은 더 직접적으로 하청업체의 엔지니어는 EPA와 Clean Air Act 규정의 전체적인 목적을 무력화 하는 코드에 승인 했다. 권한 있는 어떤 사람도 아니요 라고 말하지 못했다. 그리고 이 코드는 수많은 차량의 전자 제어 장치에 설치 되었다. 이 시점은 이러한 전체적인 시련의 가르침을 받을 만한 순간이다: 어떤 점에서 어떤 이는 더 잘 알았어야 한다. 최소한 한 명의 엔지니어라도 이시기를 거치면서 직업을 잃고, 확실하게, 한 명 이상의 임원은 탈탈 털어져야 한다.

Space Shuttle Challenger 재앙과 같이, Johnstown 홍수 같이 그리고 Fight Club의 초기의 장면 같이 이것은 엔지니어 윤리 교과서를 위한 한 부분이 될 것이다. 만약 이것인 범죄 조사로 전환될 경우 - 아마도 좋은 기회가 될 것인 - 우리는 결국 이러한 사항이 법과 사회적 책임의 완벽한 망각이 되었는지 배우게 될 것이다. 그 때까진 우리는 어떻게 자동차 역사의 가장 큰 실수 중 하나가 될지, 폭스바겐과 디젤 차량은 장차 어디에 있게 될지 추측해 볼 따름이다.

[출처 : http://hackaday.com/2015/09/23/ethics-in-engineering-volkswagens-diesel-fiasco/]

뭐. 고학력 실업자 신세인 본인에게 이러한 문제는 그림의 떡이지만, 혹시라도 여유없을 현장 엔지니어에게 도움이 될까 싶다.

2015년 7월 13일 월요일

LED 를 광센서로 활용하기



LED를 광센서로 활용하는 방법은 두 가지 있다. Cathode (음극) 센싱과 Anode (양극) 센싱이 있다. 우선 LED 설명에 앞서 다이오드의 동작원리에 대해서 살펴보자. 다이오드는 아래의 그림과 같이 P형, N형 반도체와 중간의 Depletion 지역으로 구성된다. P형 반도체는 -극성을 갖고 있는 Electron을 수용할 수 있는 용기 같은 역할을 수용하고 N형 반도체는 -극성을 갖고 있는 Electron을 포함하고 있다.


http://ffden-2.phys.uaf.edu/212_fall2003.web.dir/Marvin_Casanova/physics.htm

그리고 아래와 같이 P형 반도체 쪽에 양극을 N형 반도체 쪽에 음극을 연결하면 다이오드를 관통하는 전류가 발생한다.

http://ffden-2.phys.uaf.edu/212_fall2003.web.dir/Marvin_Casanova/physics.htm

반대로 아래의 그림과 같이 전극 연결을 반대로 하면 전류는 전혀 흐르지 못하고 P형, N형 반도체 사이에 Depletion 지역이 발생하게 된다.

http://ffden-2.phys.uaf.edu/212_fall2003.web.dir/Marvin_Casanova/physics.htm

여기서, LED를 광센서로 활용하는 (Cathode (음극) 센싱) 원리를 이해하기 위해서 바로 위의 그림 즉 다이오드를 정상 작동하지 못하는 역 전압이 걸렸을 때부터 시작해야한다.

http://jtgonz.com/led-sensing-matrix.html
역전압이 걸렸을때의 다이오드를 좀 더 자세히 살펴보면 위의 그림과 같다. P형 반도체는 +극성을 갖는 Hole들은 정체되어 왼쪽으로 쏠려 버리고, 마찬가지로 N형 반도체의 -극성의 electron들도 정체되어 오른쪽으로 쏠려 버리게 된다. 이 상태에서 Deplection 지역은 각각 쏠려 있는 hole과 electron 양 만큼의 반대 극성을 띄는 캐패시터가 순간적으로 형성된다.

http://jtgonz.com/led-sensing-matrix.html

이 상태에서 LED에 광자가 유입되면 이 Depletion 지역에 Hole과 Electron이 유입되고 미세한 전류 흐름이 발생하게 된다. 그럼 다이오드에 걸려 있는 역전압을 해제하고 광자의 유입에 따른 미세 전류의 흐름에 따른 전압을 측정하면 LED를 광센서로 활용할 수 있다. (Depletion 지역에 캐패시터가 형성 되기 때문에 일정 시간 이후에도 광자에 의한 전류 흐름은 일정 시간 이후에http://jtgonz.com/led-sensing-matrix.html도 지속된다.)

http://jtgonz.com/led-sensing-matrix.html

그리고 Anode (양극) 센싱은 Cathode 센싱에 비해서 추가적인 하드웨어 비용이 들지만, 수 ms나 s가 걸리던 센싱 시간을 us 단위로 줄일 수 있다. Anode 센싱을 위해선 아래의 그림과 같이 Anode 단에 analog input을 수용하는 단자를 연결하고, 반대편은 0V를 연결한다. 광자에 의한 전류의 흐름은 Cathode 센싱과 마찬가지로 이루어지고 전압차가 alalog input 단자에서 감지된다.

http://jtgonz.com/led-sensing-matrix.html

앞서 이야기 했듯이 이방법을 사용하면 여러개의 LED을 스캔하는데 수 ms면 LED로 광량을 측정 할 수 있다. 그래서 속도적인 측면에서 Anode 센싱 기법을 사용하는 것을 추천한다. 하지만, 각각의 LED에 전용 ADC를 연결해야 하기 때문에 CPU에 내장된 ADC이상의 외부 ADC를 사용해야하는 경우가 발생하기 때문에 비용이 많이 든다.

[참고자료]
http://ffden-2.phys.uaf.edu/212_fall2003.web.dir/Marvin_Casanova/physics.htm
http://jtgonz.com/led-sensing-matrix.html

2015년 7월 9일 목요일

[작업중] Barrel Distortion이라 불리는 렌즈 왜곡 해결 알고리즘

우선 Barrel Distortion이란 무엇인지 다음의 사진을 보면 명확해진다.


[참고자료]
http://www.tannerhelland.com/4743/simple-algorithm-correcting-lens-distortion/
http://sprg.massey.ac.nz/ivcnz/Proceedings/IVCNZ_73.pdf

2015년 7월 1일 수요일

[작업중] TP-LINK WR703N 설정하기

1. OpenWRT의 배포본 설치하기
다음의 바이너리이미지를 다운로드한다.

 https://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin

구체적인 설치 방법은 다음의 링크를 통해서 해결하자.

http://wiki.xinchejian.com/wiki/Install_OpenWRT_on_TPlink_WR703N
https://translate.google.com/translate?sl=auto&tl=en&js=y&prev=_t&hl=ko&ie=UTF-8&u=http%3A%2F%2Fwww.geeknimo.com%2F2013%2F10%2F14%2Fopenwrt%25E7%259A%2584%25E7%25A0%2594%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0%25E4%25BA%258C%2F&edit-text=

2.WIFI 설정하기
WR703N은 기본적으로 WIFI가 비활성화 되어 있다. 우선 보드에 접속한다. 보드에 접속하는 방법은 이더넷을 연결하거나 보드에서 RS232포트를 집적 뽑아내어 터미널로 로그인하는 방법이다. 자세한 접속 방법은 다음의 링크를 참조하자.

http://www.instructables.com/id/TL-WR703N-serial-port/

보드에 접속하여 /etc/config/network 파일에 다음과 같이 수정한다.

config interface 'wan'
             option ifname 'wlan0'
             option proto 'dhcp'

그리고 구체적인 무선통신 설정은 /etc/config/wireless 파일을 다음과 같이 수정하여 해결한다.

             # REMOVE THIS LINE TO ENABLE WIFI:
config wifi-iface
             option device radio0
             option network wan
             option mode sta
             option ssid '와이파이네트워크이름'
             option encryption psk
             option key '와이파이네트워크암호'


리부팅한다. 참고적으로 위의 와이파이 네트워크는 주변의 사용 가능한 SSID와 암호이어야 한다. 그래야 인터넷에 접속하여 다음의 사항들을 진행할 수 있다.

3. sysupgrade 설치


4. opkg 설치

용량한계에 따른 문제들

tftp 설치

커스텀 롬 설치하기

10. mjpg-streamer 설치하기

http://wiki.openwrt.org/doc/howto/webcam

mjpg-streamer 컴파일

소스 코드를 고쳐서 mjpg-streamer를 사용해야 하기 때문에 소스코드를 직접 컴파일해 보았다.
우선 가장 먼저 맞이하게 되는 문제는 다음과 같다.

mjpg_streamer.c:27:28: fatal error: linux/videodev.h: No such file or directory

이건 다음의 심볼릭 링크를 만들어서 해결하면된다.

# ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h

그리고 두 번째 봉착하게 되는 문제는 unsigned long int와 int * 사이에 발생하는 cast 오류이다. 이것은 문제가 되는 파일의 컴파일을 무시하는 방식으로 처리하자. mjpg-streamer의 Makefile의 다음 라인을

plugins: input_uvc.so output_file.so output_http.so input_testpicture.so output_autofocus.so inputgspcav1.so

아래와 같이 수정한다.

plugins: input_uvc.so output_file.so output_http.so input_testpicture.so  output_autofocus.so

여전히 문제점이 하나 남아 있다. plugins/input_uvc/uvcvideo.h파일에 다음 라인을 추가한다.

#include "linux/videodev2.h"

아직 혼돈 스럽지만 컴파일은 이로써 가능하다.

2015년 4월 23일 목요일

주목할 만한 프로젝트들

1.해커데이에서 지구의 날 특집으로 소개된 초소형 스펙트로 미터가 흥미롭다.

https://hackaday.io/project/4141-c12666ma-micro-spectrometer

핵심은 하마마츠에서 판매하는 캔 타입의 C12666MA는 chip 타입의 grating과 linear CMOS 센서로 구성되며 이러한 개념으로 계속 버전업을 해왔나 보다. 응답유효 파장대가 340nm 에서 780nm으로 일반적인 형광 반응과 컬러 측정이 가능할 것이다. 아래의 데이터 시트를 살펴보면 다른 파장대의 센서도 판매하고 있다. 가격이 아직 착한 상황은 아니지만 약 200~300 달러 인 것 같다. 계속 주의 깊게 살펴보아야 겠다.

http://www.hamamatsu.com/resources/pdf/ssd/c12666ma_kacc1216e.pdf

2. 마찬가지로 해커데이에서 소개된 wifi 모듈이다. 단순한 wifi모듈은 아니고 Atheros사의 지금은 Qualcomm사에 합병된 회사의 AR9331로 구성된 하나의 리눅스 시스템이다.

http://hackaday.com/2015/04/22/kickstarting-even-more-router-based-dev-boards/

그 구성이 한동안 유행되었던 OpenWRT기기인 DT-Link사의 WR703n이 떠오르게한다.

http://daviddarts.com/piratebox-diy-openwrt/

조금만 살펴보면 위의 기기를 사용한 다양한 프로젝트를 고려하면 그 유용성은 상당할 것 같다.

아무튼 조만간 사용해야 할 일들이 많을 것 같다.

3. LED 모듈인데 내가 필요한 용도와는 다르지만 그 구성이 참고해 볼만 한다. 참고삼아 하나 구매해 보고 싶지만. 아무튼 살펴보자.

https://www.adafruit.com/products/1430


2015년 3월 31일 화요일

Debian 기반 리눅스 시스템에서 Adafuit의 Trinket 사용하기

1. 사전 작업 (arduino 설치)

# apt-get arduino

2. 디바이스 필터 설정
아래의 설정 파일을 생성하고 내용을 추가한다.

/etc/udev/rules.d/95-usbtiny.rules

#Adafruit Trinket
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1781", ATTR{idProduct}=="0c9f", GROUP="dialout", MODE="0666"

3. avrdude 설정 파일 변경

/etc/avrdude.conf 에서 다음의 항목들을 변경한다.


#------------------------------------------------------------
# ATtiny85
#------------------------------------------------------------

part
     id            = "t85";
     desc          = "ATtiny85";
...
 # chiperasetime = 0;
  chiperasetime = 900000;
 ...

# delay  = 6;
 delay  = 12;
...

#         min_write_delay = 4500;
#         max_write_delay = 4500;
         min_write_delay = 30000;
         max_write_delay = 30000;

4. arduino IDE를 추가 파일 설치하기
다음의 주소로 가서
https://learn.adafruit.com/introducing-trinket/setting-up-with-arduino-ide

Step 1. Add ATtiny85 Support  밑에 있는 다운로드 항목을 내려 받는다.
내려 받은 trinkethardwaresupport.zip을 압축해제한다.
해제된 파일들중 variants 디렉토리밑의 디렉토리들을 (tiny8, tiny14) 통체로
/usr/share/arduino/hardware/arduino/variants밑으로 이동한다.
그리고 /usr/share/arduino/hardware/arduino/boards.txt 파일에 다음 항목들을 추가한다.


gemma.name=Adafruit Gemma 8MHz
gemma.bootloader.low_fuses=0xF1
gemma.bootloader.high_fuses=0xD5
gemma.bootloader.extended_fuses=0xFE
gemma.upload.maximum_size=5310
gemma.build.mcu=attiny85
gemma.build.f_cpu=8000000L
gemma.build.core=arduino:arduino
gemma.build.variant=tiny8

trinket3.name=Adafruit Trinket 8MHz
trinket3.bootloader.low_fuses=0xF1
trinket3.bootloader.high_fuses=0xD5
trinket3.bootloader.extended_fuses=0xFE
trinket3.upload.maximum_size=5310
trinket3.build.mcu=attiny85
trinket3.build.f_cpu=8000000L
trinket3.build.core=arduino:arduino
trinket3.build.variant=tiny8

trinket5.name=Adafruit Trinket 16MHz
trinket5.bootloader.low_fuses=0xF1
trinket5.bootloader.high_fuses=0xD5
trinket5.bootloader.extended_fuses=0xFE
trinket5.upload.maximum_size=5310
trinket5.build.mcu=attiny85
trinket5.build.f_cpu=16000000L
trinket5.build.core=arduino:arduino
trinket5.build.variant=tiny8

##############################################################

그리고 arduino IDE에서 개발 보드의 제어 권을 획득하기 위해서 다음 명령을 수행한다.

# adduser <사용자명> dialout


 5. Trinket을 연결하고 인식 여부를 확인해 보자.
주의 사항: 해당 보드는 하드웨어적으로 USB 포트를 지원하지 않기 때문에 전원 인가 후 10초 동안만 펌웨어 다운로드와 보드 인식이 가능하다. 달리 말하자면 보드를 제대로 인식하고 작성된 프로그램을 업로드 하기 위해서 리셋을 사전에 누르고 10초 안에 해당 작업을 해야 한다.
# avrdude -c usbtiny -p attiny8

6. 간단한 프로그래을 테스트 해보자.
마찬가지로 업로드 하기 전에 리셋 버튼을 누르고 업로드는 10초 안에 이루어져야한다.
/*
  Blink
  Turns on an LED on for one second, t/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.

  This example code is in the public domain.

  To upload to your Gemma or Trinket:
  1) Select the proper board from the Tools->Board Menu
  2) Select USBtinyISP from the Tools->Programmer
  3) Plug in the Gemma/Trinket, make sure you see the green LED lit
  4) For windows, install the USBtiny drivers
  5) Press the button on the Gemma/Trinket - verify you see
     the red LED pulse. This means it is ready to receive data
  6) Click the upload button above within 10 seconds
*/

int led = 1; // blink 'digital' pin 1 - AKA the built in red LED

// the setup routine runs once when you press reset:
void setup() {
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);

}

// the loop routine runs over and over again forever:
void loop() {
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led, LOW);
    delay(500);
}
    hen off for one second, repeatedly.

  This example code is in the public domain.

  To upload to your Gemma or Trinket:
  1) Select the proper board from the Tools->Board Menu
  2) Select USBtinyISP from the Tools->Programmer
  3) Plug in the Gemma/Trinket, make sure you see the green LED lit
  4) For windows, install the USBtiny drivers
  5) Press the button on the Gemma/Trinket - verify you see
     the red LED pulse. This means it is ready to receive data
  6) Click the upload button above within 10 seconds
*/

int led = 1; // blink 'digital' pin 1 - AKA the built in red LED

// the setup routine runs once when you press reset:
void setup() {
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);

}

// the loop routine runs over and over again forever:
void loop() {
    digitalWrite(led, HIGH);
    delay(500);
    digitalWrite(led, LOW);
    delay(500);
}