<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
		<id>http://lhdangerous.godohosting.com/wiki/index.php?action=history&amp;feed=atom&amp;title=GPS_module_neo-6m</id>
		<title>GPS module neo-6m - 편집 역사</title>
		<link rel="self" type="application/atom+xml" href="http://lhdangerous.godohosting.com/wiki/index.php?action=history&amp;feed=atom&amp;title=GPS_module_neo-6m"/>
		<link rel="alternate" type="text/html" href="http://lhdangerous.godohosting.com/wiki/index.php?title=GPS_module_neo-6m&amp;action=history"/>
		<updated>2026-04-18T10:31:58Z</updated>
		<subtitle>이 문서의 편집 역사</subtitle>
		<generator>MediaWiki 1.28.2</generator>

	<entry>
		<id>http://lhdangerous.godohosting.com/wiki/index.php?title=GPS_module_neo-6m&amp;diff=263&amp;oldid=prev</id>
		<title>Doguin: 새 문서: # GPS + raspberry pi  ## gps module Neo-6m gps 모듈을 사용한다. 대부분의 gps 모듈이 serial UART 통신을 사용한다. 참고자료가 많은 쪽이 좋으므로  시...</title>
		<link rel="alternate" type="text/html" href="http://lhdangerous.godohosting.com/wiki/index.php?title=GPS_module_neo-6m&amp;diff=263&amp;oldid=prev"/>
				<updated>2019-09-15T04:37:56Z</updated>
		
		<summary type="html">&lt;p&gt;새 문서: # GPS + raspberry pi  ## gps module Neo-6m gps 모듈을 사용한다. 대부분의 gps 모듈이 serial UART 통신을 사용한다. 참고자료가 많은 쪽이 좋으므로  시...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;# GPS + raspberry pi&lt;br /&gt;
&lt;br /&gt;
## gps module&lt;br /&gt;
Neo-6m gps 모듈을 사용한다.&lt;br /&gt;
대부분의 gps 모듈이 serial UART 통신을 사용한다. 참고자료가 많은 쪽이 좋으므로  시리얼 통신방식 부품을 고른다.&lt;br /&gt;
&amp;lt;br&amp;gt;![||600](https://www.makerlab-electronics.com/my_uploads/2017/06/GPS-Module-01.jpg)&lt;br /&gt;
&lt;br /&gt;
	5Hz position update rate&lt;br /&gt;
	EEPROM to save configuration settings&lt;br /&gt;
	Rechargeable battery for Backup&lt;br /&gt;
	The cold start time of 38 s and Hot start time of 1 s&lt;br /&gt;
	Configurable from 4800 Baud to 115200 Baud rates. (default 9600)&lt;br /&gt;
	SuperSense ® Indoor GPS: -162 dBm tracking sensitivity&lt;br /&gt;
	Support SBAS (WAAS, EGNOS, MSAS, GAGAN)&lt;br /&gt;
	Separated 18X18mm GPS antenna&lt;br /&gt;
	Supply voltage: 3.3 V&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## 회로 구성&lt;br /&gt;
라즈베리의 8번째, 10번째 핀이  시리얼 통신용이다.&lt;br /&gt;
&amp;lt;br&amp;gt;![||600](https://cdn.instructables.com/FP7/CQBO/ICJLZ1TL/FP7CQBOICJLZ1TL.LARGE.jpg?auto=webp&amp;amp;frame=1&amp;amp;width=664&amp;amp;fit=bounds)  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;![||600](https://cl.ly/49839d/Image%202019-08-30%20at%204.54.46%20PM.png)&lt;br /&gt;
&lt;br /&gt;
## 라즈베리파이 시리얼 포트 설정&lt;br /&gt;
참고: http://lhdangerous.godohosting.com/wiki/index.php/%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC%ED%8C%8C%EC%9D%B4_%EC%8B%9C%EB%A6%AC%EC%96%BC_%ED%86%B5%EC%8B%A0_%EC%84%A4%EC%A0%95_(setting_up_Raspberry_pi_serial_connection_via_GPIO) &lt;br /&gt;
&lt;br /&gt;
##  GPS FIX&lt;br /&gt;
* gps에서 사용되는 중요한 개념중에  FIX라는 것이 있다.&lt;br /&gt;
디바이스를 부팅하고나서도 위성으로부터 전파를 받아 디바이스의 위치를 계산할 수 았으려면 조금 시간이 걸리는데, 이렇게 충분한 데이터를 모아 자신의 위치를 계산할 수 있게되면 fix되었다라고 이야기한다. 더 구체적인 내용은 공부를 더 해보자.&lt;br /&gt;
&lt;br /&gt;
* neo-6m gps는 유난히  fix 하는데 시간이 오래 걸리는 듯 하다. 위성 신호가 잘 잡혀도 길게는 10분정도 걸리는 경우가 있다.  &lt;br /&gt;
&lt;br /&gt;
## NMEA 프로토콜&lt;br /&gt;
gps 통신 표준을 관리하는 곳은 재미있게도 NMEA, 'National Marine Electronics Association' 해양전자협회? 이다. 그래서 gps표준 프로토콜 이름도 'NMEA-0183' 이다.  &lt;br /&gt;
잘 정리된 한글자료: https://techlog.gurucat.net/239 [하얀쿠아의 이것저것 만들기 Blog]&lt;br /&gt;
nmea 표준 레퍼런스: https://www.sparkfun.com/datasheets/GPS/NMEA%20Reference%20Manual-Rev2.1-Dec07.pdf  &lt;br /&gt;
&lt;br /&gt;
NMEA 데이터 형태&lt;br /&gt;
 ``` $GPGGA,141113.999,3730.0308,N,12655.2369,E,1,06,1.7,98.9,M,,,,0000*3E&lt;br /&gt;
&lt;br /&gt;
$GPGSA,A,3,02,07,01,20,04,13,,,,,,,3.7,1.7,3.2*31&lt;br /&gt;
&lt;br /&gt;
$GPRMC,141113.999,A,3730.0308,N,12655.2369,E,19.77,195.23,101200,,*3C&lt;br /&gt;
&lt;br /&gt;
$GPGGA,141114.999,3730.0264,N,12655.2351,E,1,07,1.2,98.8,M,,,,0000*3C&lt;br /&gt;
&lt;br /&gt;
$GPGSA,A,3,02,07,01,20,24,04,13,,,,,,2.3,1.2,1.9*3E&lt;br /&gt;
&lt;br /&gt;
$GPRMC,141114.999,A,3730.0264,N,12655.2351,E,15.51,202.12,101200,,*3C&lt;br /&gt;
&lt;br /&gt;
$GPGGA,141115.999,3730.0231,N,12655.2345,E,1,07,1.2,98.7,M,,,,0000*37&lt;br /&gt;
&lt;br /&gt;
$GPGSA,A,3,02,07,01,20,24,04,13,,,,,,2.3,1.2,1.9*3E&lt;br /&gt;
&lt;br /&gt;
$GPGSV,2,1,07,07,84,025,47,04,51,289,48,20,40,048,47,02,32,203,46*74&lt;br /&gt;
&lt;br /&gt;
$GPGSV,2,2,07,01,23,101,47,13,20,131,32,24,19,268,40*49&lt;br /&gt;
&lt;br /&gt;
$GPRMC,141115.999,A,3730.0231,N,12655.2345,E,12.14,194.75,101200,,*33&lt;br /&gt;
&lt;br /&gt;
$GPGGA,141116.999,3730.0210,N,12655.2330,E,1,07,1.2,98.5,M,,,,0000*37&lt;br /&gt;
&lt;br /&gt;
$GPGSA,A,3,02,07,01,20,24,04,13,,,,,,2.3,1.2,1.9*3E&lt;br /&gt;
&lt;br /&gt;
$GPRMC,141116.999,A,3730.0210,N,12655.2330,E,8.01,194.65,101200,,*0F&lt;br /&gt;
&lt;br /&gt;
$GPGGA,141117.998,3730.0199,N,12655.2320,E,1,06,1.3,98.2,M,,,,0000*33&lt;br /&gt;
&lt;br /&gt;
$GPGSA,A,3,02,07,01,20,24,04,,,,,,,2.4,1.3,2.0*30&lt;br /&gt;
```&lt;br /&gt;
* $ : 각 문장의 시작&lt;br /&gt;
* \n (CR/LF) : 각 문장의 끝&lt;br /&gt;
* sentence id : $다음에 오는 다섯 글자로,디바이스 종류를 밝히는두자(예를들어 GP) 와 이어지는 데이터 종류를 밝히는 3글자(예를들어 GGA)로 구성됨.&lt;br /&gt;
* 데이터: 콤마로 구분된 데이터들은  앞의 sentence id에 따라 해석하게 된다.&lt;br /&gt;
가장 기본적인 몇가지만 읽는 방법을 알아보자&lt;br /&gt;
### GPGGA&lt;br /&gt;
GPGGA는 'Global Positioning System Fix Data'를 의미한다.  아래의 GPGGA 예제 sentence를 살펴보자.&lt;br /&gt;
&lt;br /&gt;
 GPGGA는 총 17개의 field를 가진다.&lt;br /&gt;
&amp;lt;br&amp;gt;![||600](https://cl.ly/de0df9/Image%202019-09-04%20at%203.10.19%20PM.png)&lt;br /&gt;
&amp;lt;br&amp;gt;![||600](https://cl.ly/69bb04/Image%202019-09-04%20at%203.10.36%20PM.png)&lt;br /&gt;
&lt;br /&gt;
### GPRMC&lt;br /&gt;
GPRMC는 'Recommended Minimum Specific GNSS Data'로 정의되어있다.&lt;br /&gt;
NMEA에는 GPS에서 필수적인 PVT(Position, Velocity, Time) 데이터의 고유한 버전이 있다.&lt;br /&gt;
그것을 RMC라고 부른다. 'RMC'에서 RM이 Recommended Minimum의 약자이고, C는 GNSS를 의미한다. RMA, RMB도 있으며 각각 LORAN-C와 Navigation을 의미한다. 상식으로 알아두자.&lt;br /&gt;
&amp;lt;br&amp;gt;![||600](https://cl.ly/fc6b5f/Image%202019-09-04%20at%203.11.51%20PM.png)&lt;br /&gt;
&amp;lt;br&amp;gt;![||600](https://cl.ly/f09f14/Image%202019-09-04%20at%203.12.04%20PM.png)&lt;br /&gt;
&lt;br /&gt;
### GPGSV&lt;br /&gt;
GSV는 'GNSS Satellite in View' 를 의미한다. 각각 위성의 상태에 대해 나와있는 문장이다.&lt;br /&gt;
&amp;lt;br&amp;gt;![||600](https://cl.ly/50a166/Image%202019-09-04%20at%203.13.52%20PM.png)&lt;br /&gt;
&lt;br /&gt;
### checksum&lt;br /&gt;
NMEA checksum 계산방법 및 예제코드&lt;br /&gt;
지금까지 예제로 보여준 NMEA sentence들을 살펴보면 알겠지만, checksum은 * 뒤에 16진수 두자리로 표시한다.&lt;br /&gt;
&lt;br /&gt;
checksum의 계산은 $, * 의 사이에 있는 각 문자를 exclusive-or (XOR) 연산한 값을 표시한다.&lt;br /&gt;
&lt;br /&gt;
어떤 NMEA sentence가 주어지면, * 뒤에 있는 16진수 두자리의 checksum과 직접 XOR연산한 값이 일치하는지를 검사해야 한다. 일치하지 않는다면, 그 sentence는 통신상의 문제 등의 이유로, 결함이 있는 것으로 간주해야 하며, 사용하면 안된다.&lt;br /&gt;
예를 들어보자.&lt;br /&gt;
&lt;br /&gt;
&amp;gt;$GPRMC,155123.000,A,4043.8432,N,07359.7653,W,0.15,83.25,200407,,\*28&lt;br /&gt;
&lt;br /&gt;
이와 같은 NMEA sentence가 주어졌을때, checksum계산을 위한 XOR연산은 아래 각 문자들에 대해서 수행하면 된다.&lt;br /&gt;
&lt;br /&gt;
&amp;gt;GPRMC,155123.000,A,4043.8432,N,07359.7653,W,0.15,83.25,200407,,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## python 에서  NMEA 데이터 사용 예제&lt;br /&gt;
### manually&lt;br /&gt;
참고: http://ozzmaker.com/using-python-with-a-gps-receiver-on-a-raspberry-pi/&lt;br /&gt;
&lt;br /&gt;
```python&lt;br /&gt;
import serial&lt;br /&gt;
&lt;br /&gt;
port = &amp;quot;/dev/serial0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def parseGPS(data):&lt;br /&gt;
#    print &amp;quot;raw:&amp;quot;, data #prints raw data&lt;br /&gt;
    if data[0:6] == &amp;quot;$GPRMC&amp;quot;:&lt;br /&gt;
        sdata = data.split(&amp;quot;,&amp;quot;)&lt;br /&gt;
        if sdata[2] == 'V':&lt;br /&gt;
            print &amp;quot;no satellite data available&amp;quot;&lt;br /&gt;
            return&lt;br /&gt;
        print &amp;quot;---Parsing GPRMC---&amp;quot;,&lt;br /&gt;
        time = sdata[1][0:2] + &amp;quot;:&amp;quot; + sdata[1][2:4] + &amp;quot;:&amp;quot; + sdata[1][4:6]&lt;br /&gt;
        lat = decode(sdata[3]) #latitude&lt;br /&gt;
        dirLat = sdata[4]      #latitude direction N/S&lt;br /&gt;
        lon = decode(sdata[5]) #longitute&lt;br /&gt;
        dirLon = sdata[6]      #longitude direction E/W&lt;br /&gt;
        speed = sdata[7]       #Speed in knots&lt;br /&gt;
        trCourse = sdata[8]    #True course&lt;br /&gt;
        date = sdata[9][0:2] + &amp;quot;/&amp;quot; + sdata[9][2:4] + &amp;quot;/&amp;quot; + sdata[9][4:6]#date&lt;br /&gt;
&lt;br /&gt;
        print &amp;quot;time : %s, latitude : %s(%s), longitude : %s(%s), speed : %s, True Course : %s, Date : %s&amp;quot; %  (time,lat,dirLat,lon,dirLon,speed,trCourse,date)&lt;br /&gt;
&lt;br /&gt;
def decode(coord):&lt;br /&gt;
    #Converts DDDMM.MMMMM &amp;gt; DD deg MM.MMMMM min&lt;br /&gt;
    x = coord.split(&amp;quot;.&amp;quot;)&lt;br /&gt;
    head = x[0]&lt;br /&gt;
    tail = x[1]&lt;br /&gt;
    deg = head[0:-2]&lt;br /&gt;
    min = head[-2:]&lt;br /&gt;
    return deg + &amp;quot; deg &amp;quot; + min + &amp;quot;.&amp;quot; + tail + &amp;quot; min&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Receiving GPS data&amp;quot;&lt;br /&gt;
ser = serial.Serial(port, baudrate = 9600, timeout = 0.5)&lt;br /&gt;
while True:&lt;br /&gt;
   data = ser.readline()&lt;br /&gt;
   parseGPS(data)&lt;br /&gt;
 ```&lt;br /&gt;
&lt;br /&gt;
### pynmea2 library 사용&lt;br /&gt;
NMEA 데이터 파싱을 도와주는 pynmea2 라이브러리를 사용할 수 있다.&lt;br /&gt;
* 라이브러리 설치&lt;br /&gt;
```bash&lt;br /&gt;
$ pip install pynmea2&lt;br /&gt;
```&lt;br /&gt;
* 예제&lt;br /&gt;
&lt;br /&gt;
```python&lt;br /&gt;
import serial&lt;br /&gt;
import pynmea2&lt;br /&gt;
&lt;br /&gt;
port = &amp;quot;/dev/serial0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def parseGPS(str):&lt;br /&gt;
    if str.find('GGA') &amp;gt; 0:&lt;br /&gt;
        msg = pynmea2.parse(str)&lt;br /&gt;
        print &amp;quot;Timestamp: %s -- Lat: %s %s -- Lon: %s %s -- Altitude: %s %s -- Satellites: %s&amp;quot; % (msg.timestamp,msg.lat,msg.lat_dir,msg.lon,msg.lon_dir,msg.altitude,msg.altitude_units,msg.num_sats)&lt;br /&gt;
&lt;br /&gt;
serialPort = serial.Serial(port, baudrate = 9600, timeout = 0.5)&lt;br /&gt;
while True:&lt;br /&gt;
    str = serialPort.readline()&lt;br /&gt;
    parseGPS(str)&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## GPSD&lt;br /&gt;
gpsd 는 GPS daemon의 약자로, 백그라운드에서 동작하면서  gps 사용을 도와주는 프로그램이다. 시리얼포트에서 들어오는 로데이터를 바로 사용할 수도 있지만, gpsd과, 이와 연계된 라이브러리를 사용하면 더 쉽게  gps가 제공하는 정보를 활용할 수 있다.&lt;br /&gt;
Adafruit 참고자료: https://learn.adafruit.com/adafruit-ultimate-gps-hat-for-raspberry-pi/use-gpsd&lt;br /&gt;
gpsd 공식문서:https://gpsd.gitlab.io/gpsd/index.html&lt;br /&gt;
&lt;br /&gt;
### gpsd 와 파이썬 라이브러리 설치&lt;br /&gt;
```bash&lt;br /&gt;
$ sudo apt-get update&lt;br /&gt;
$ sudo apt-get install gpsd gpsd-clients python-gps&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
### 라즈비안의 디폴트 서비스 제거&lt;br /&gt;
라즈비안에서는 라즈베리파이에 USB를 통해 외부 gps장치를 연결이 감지되면 gpsd가 실행되도록하는 systemd 서비스가 기본 켜져있다. 이 부분이 간섭일으키므로  disable 시킨다.&lt;br /&gt;
```bash&lt;br /&gt;
$ sudo systemctl stop gpsd.socket&lt;br /&gt;
$ sudo systemctl disable gpsd.socket&lt;br /&gt;
```&lt;br /&gt;
#### 부팅시 gpsd 자동으로 시작하기&lt;br /&gt;
* [ ] systemd를 죽이는 대신에 usb가 아닌 serial0에 연결된 gps 가 부팅과 동시에 실행되도록 하려면, /etc/default/gpsd 를 수정토록 한다.&lt;br /&gt;
```bash&lt;br /&gt;
$ sudo nano /etc/default/gpsd&lt;br /&gt;
```&lt;br /&gt;
 from:&lt;br /&gt;
 &amp;gt;DEVICES=&amp;quot;&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
 to:&lt;br /&gt;
 &amp;gt;DEVICES=&amp;quot;/dev/serial0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 그리고  systemd  서비스는 다시 켜준다.&lt;br /&gt;
 ```bash&lt;br /&gt;
 $ sudo systemctl enable gpsd.socket&lt;br /&gt;
 $ sudo systemctl start gpsdsocket&lt;br /&gt;
 ```&lt;br /&gt;
&lt;br /&gt;
### gpsd 실행&lt;br /&gt;
```bash&lt;br /&gt;
$ sudo gpsd /dev/serial0 -F /var/run/gpsd.sock&lt;br /&gt;
```&lt;br /&gt;
끌 때는&lt;br /&gt;
``` bash&lt;br /&gt;
$ sudo killall gpsd&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
### test: cgps&lt;br /&gt;
gpsd가 제공하는 데이터를 실시간으로 확인할 수 있다.&lt;br /&gt;
```bash&lt;br /&gt;
$ cgps&lt;br /&gt;
```&lt;br /&gt;
&amp;lt;br&amp;gt;![||600](https://cl.ly/dc6e40/Image%202019-09-04%20at%2012.36.37%20PM.png)&lt;br /&gt;
&lt;br /&gt;
### gpsd 가 제공하는 데이터 구조&lt;br /&gt;
gpsd의 데이터는 json 형식으로,  'class' attribute 에 따라 해석한다.&lt;br /&gt;
gpsd 프로토콜 공식문서: https://gpsd.gitlab.io/gpsd/gpsd_json.html&lt;br /&gt;
&lt;br /&gt;
####  gpsd + python 예제&lt;br /&gt;
* gpsd로부터  TPV (time, position, velocity) 기본정보 가져오기&lt;br /&gt;
&lt;br /&gt;
```python&lt;br /&gt;
#! /usr/bin/python&lt;br /&gt;
&lt;br /&gt;
from gps import *&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
gpsd = gps(mode=WATCH_ENABLE|WATCH_NEWSTYLE)&lt;br /&gt;
print 'latitude\tlongitude\ttime utc\t\t\taltitude\tepv\tept\tspeed\tclimb' # '\t' = TAB to try and output the data in columns.&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    while True:&lt;br /&gt;
        report = gpsd.next() #&lt;br /&gt;
        if report['class'] == 'TPV':&lt;br /&gt;
&lt;br /&gt;
            print  getattr(report,'lat',0.0),&amp;quot;\t&amp;quot;,&lt;br /&gt;
            print  getattr(report,'lon',0.0),&amp;quot;\t&amp;quot;,&lt;br /&gt;
            print getattr(report,'time',''),&amp;quot;\t&amp;quot;,&lt;br /&gt;
            print  getattr(report,'alt','nan'),&amp;quot;\t\t&amp;quot;,&lt;br /&gt;
            print  getattr(report,'epv','nan'),&amp;quot;\t&amp;quot;,&lt;br /&gt;
            print  getattr(report,'ept','nan'),&amp;quot;\t&amp;quot;,&lt;br /&gt;
            print  getattr(report,'speed','nan'),&amp;quot;\t&amp;quot;,&lt;br /&gt;
            print getattr(report,'climb','nan'),&amp;quot;\t&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
except (KeyboardInterrupt, SystemExit): #when you press ctrl+c&lt;br /&gt;
    print &amp;quot;Done.\nExiting.&amp;quot;&lt;br /&gt;
```&lt;br /&gt;
* 인공위성 정보 가져오기&lt;br /&gt;
&lt;br /&gt;
```python&lt;br /&gt;
#! /usr/bin/python&lt;br /&gt;
&lt;br /&gt;
from gps import *&lt;br /&gt;
import time&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
gpsd = gps(mode=WATCH_ENABLE|WATCH_NEWSTYLE)&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
    while True:&lt;br /&gt;
&lt;br /&gt;
        report = gpsd.next() #&lt;br /&gt;
        if report['class'] == 'SKY':&lt;br /&gt;
            os.system('clear')&lt;br /&gt;
            print ' Satellites (total of', len(gpsd.satellites) , ' in view)'&lt;br /&gt;
            for i in gpsd.satellites:&lt;br /&gt;
                print 't', i&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            print '\n\n'&lt;br /&gt;
            print 'PRN = PRN ID of the satellite. 1-63 are GNSS satellites, 64-96 are GLONASS satellites, 100-164 are SBAS satellites'&lt;br /&gt;
            print 'E = Elevation in degrees'&lt;br /&gt;
            print 'As = Azimuth, degrees from true north'&lt;br /&gt;
            print 'ss = Signal stength in dB'&lt;br /&gt;
            print 'used = Used in current solution?'&lt;br /&gt;
&lt;br /&gt;
        time.sleep(1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
except (KeyboardInterrupt, SystemExit): #when you press ctrl+c&lt;br /&gt;
    print &amp;quot;Done.\nExiting.&amp;quot;&lt;br /&gt;
```&lt;/div&gt;</summary>
		<author><name>Doguin</name></author>	</entry>

	</feed>