
рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рд╣рдо рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдШрдЯрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдорд╢реАрди рдХреИрд╕реЗ рдЬреАрд╡рди рдореЗрдВ рдЖрдИред рдХрд┐рд╕ рдУрдПрд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдХрд┐рд╕ рднрд╛рд╖рд╛ рдХреЛ рдЪреБрдирд╛ рдЧрдпрд╛, рдХрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
1. рдпрд╣ 2 рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рд╕рд░реНрд╡рд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЯрд╛рдЗрдкрд░рд╛рдЗрдЯрд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдВрд╕реЛрд▓ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рд╡рд╛рдИрдлрд╛рдИ рдПрдХреНрд╕реЗрд╕ рдкреНрд╡рд╛рдЗрдВрдЯ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреИрдорд░реЗ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдХреЛ рднреА рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
2. рдУрдПрд╕
рдЕрдм рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреАред
рдЪреВрдВрдХрд┐ рдкреВрд░реА рдкреНрд░рдгрд╛рд▓реА рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкрд╛рдИ 3 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдУрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рдордп, рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдЯреНрд░реЗрдЪ рдерд╛, рдпрд╣ рдПрдХ рдЯрд╛рдЗрдкрд░рд╛рдЗрдЯрд░ рдФрд░ рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдкрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рдмрдЧ (рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХреЗ рд▓рд┐рдП рддрдбрд╝рдкрд╛ рд╣реБрдЖ) рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рд╡рд╛рдИрдлрд╛рдИ рдПрдХреНрд╕реЗрд╕ рдкреНрд╡рд╛рдЗрдВрдЯ рдХреЛ рдЙрдард╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХреНрд╕реЗрд╕ рдкреЙрдЗрдВрдЯ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреЗрд╕реА рдХрд╛ рдПрдХ рдкрд┐рдЫрд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдирд╣реАрдВ рдереАрдВред
рд▓реЗрдЦ рдПрдХ рдкрд╣реБрдВрдЪ рдмрд┐рдВрджреБ рдХреИрд╕реЗ рдмрдврд╝рд╛рдПрдВред рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд, рдЙрд╕ рдкрд░ рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ред
рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдорд╢реАрди рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рдПрдХреНрд╕реЗрд╕ рдкреНрд╡рд╛рдЗрдВрдЯ рдмрдврд╝рд╛рддрд╛ рд╣реИред
рдлрд╝рд╛рдЗрд▓ / etc / рдиреЗрдЯрд╡рд░реНрдХ / рдЗрдВрдЯрд░рдлреЗрд╕ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рдмрд╛рдд рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрдиреЗрдХреНрд╢рди:
auto wlan0 iface wlan0 inet dhcp wpa-ssid {ssid} wpa-psk {password}
2. рднрд╛рд╖рд╛
рдореИрдВрдиреЗ рдЕрдЬрдЧрд░ рдХреЛ рдЪреБрдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╕рд╛рди рдФрд░ рд╕рд░рд▓ рд╣реИред
3. рд╕рд░реНрд╡рд░
рдЗрд╕ рдЦрдВрдб рдореЗрдВ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛ рдХрд┐ рдорд╢реАрди рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ред
рд╕рд░реНрд╡рд░ рдореЗрдВ 2 рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВред рд╡реАрдбрд┐рдпреЛ рд╕рд░реНрд╡рд░ рдФрд░ рдкреНрд░рдмрдВрдзрди рд╕рд░реНрд╡рд░ред
3.1 рд╡реАрдбрд┐рдпреЛ рд╕рд░реНрд╡рд░
рд╡реАрдбрд┐рдпреЛ рдХреИрдорд░рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ 2 рд╡рд┐рдХрд▓реНрдк рдереЗред рдкрд╣рд▓рд╛ рдЙрдкрдпреЛрдЧ рдкрд┐рдХрд╛рдореЗрд░рд╛ рдореЙрдбреНрдпреВрд▓ рдФрд░ рджреВрд╕рд░рд╛ рдЙрдкрдпреЛрдЧ mjpg-streamer рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ ред рджреЛ рдмрд╛рд░ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд┐рдирд╛, рдореИрдВрдиреЗ рдЙрди рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдЬреЛ рдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
if conf.conf.VideoServerType == 'm' : cmd = "cd /home/pi/projects/mjpg-streamer-experimental && " cmd += './mjpg_streamer -o "./output_http.so -p {0} -w ./www" -i "./input_raspicam.so -x {1} -y {2} -fps 25 -ex auto -awb auto -vs -ISO 10"'.format(conf.conf.videoServerPort, conf.conf.VideoWidth, conf.conf.VideoHeight) print(cmd) os.system(cmd) else : with picamera.PiCamera(resolution = str(conf.conf.VideoWidth) + 'x' + str(conf.conf.VideoHeight) , framerate = conf.conf.VideoRate) as Camera: output = camera.StreamingOutput() camera.output = output Camera.start_recording(output, format = 'mjpeg') try: address = (conf.conf.ServerIP, conf.conf.videoServerPort) server = camera.StreamingServer(address, camera.StreamingHandler) server.serve_forever() finally: Camera.stop_recording()
рдЪреВрдВрдХрд┐ рд╡реЗ рд╕рдорд╛рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдПрдХ рд╣реА рдкрддреЗ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╕реЗ рджреВрд╕рд░реЗ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдкрд░ рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ mjpg-streamer рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
3.2 рдкреНрд░рдмрдВрдзрди рд╕рд░реНрд╡рд░
3.2.1 рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рд╕рд╣рднрд╛рдЧрд┐рддрд╛
рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХреНрд╕рдЪреЗрдВрдЬ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдорд╛рдВрдб рдХрд░рддрд╛ рд╣реИ:
{'type': 'remote', 'cmd': 'Start', 'status': True, 'val': 0.0} {'type': 'remote', 'cmd': 'Y', 'status': True, 'val': 0.5} {'type': 'remote', 'cmd': 'turn', 'x': 55, 'y': 32}
- рдХрдорд╛рдВрдб рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ (рдХреНрд▓рд╛рдЗрдВрдЯ рдпрд╛ рд╕рд░реНрд╡рд░) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯрд╛рдЗрдк рдХрд░реЗрдВ - 'рд░рд┐рдореЛрдЯ' рдпрд╛ 'рдХрд╛рд░'
- cmd - рдЧреЗрдо HAT рдкрд░ рдмрдЯрди рдХреЗ рдирд╛рдо рдХреЗ рдЕрдиреБрд░реВрдк рдмрдЯрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
- рд╕реНрдЯрд╛рд░реНрдЯ - рд╕реНрдЯрд╛рд░реНрдЯ рдмрдЯрди
- Select - рд╕реЗрд▓реЗрдХреНрдЯ рдмрдЯрди
- рд╡рд╛рдИ - рд╡рд╛рдИ рдмрдЯрди
- рдЖрджрд┐
- рдЯрд░реНрди - рдЬреЙрдпрд╕реНрдЯрд┐рдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб, рдкрд╣рд┐рдпреЛрдВ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ
- рд╕реНрдерд┐рддрд┐ - рд╕рд╣реА рдпрд╛ рдЧрд▓рдд, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдПрдХ рдмрдЯрди рд╕реНрдерд┐рддрд┐ рдШрдЯрдирд╛ рд╣рд░ рдмрд╛рд░ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рд╡реИрд▓ - -1 ... 1 рд╕реЗ рдореЛрдЯрд░ рдХреА рдЧрддрд┐ рдХреА рджрд┐рд╢рд╛ рдФрд░ рджрд┐рд╢рд╛, рдкреНрд░рдХрд╛рд░ рдлреНрд▓реЛрдЯ рдХрд╛ рдореВрд▓реНрдпред рдХреЗрд╡рд▓ рдЧрддрд┐ рдмрдЯрди рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреИрд░рд╛рдореАрдЯрд░ред
- x -100 рд╕реЗ x рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдЬреЙрдпрд╕реНрдЯрд┐рдХ рдХрд╛ рд╡рд┐рдЪрд▓рди ... 100, рдкреНрд░рдХрд╛рд░ int рдХрд╛ рдорд╛рди
- y -100 рд╕реЗ y рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдЬреЙрдпрд╕реНрдЯрд┐рдХ рдХрд╛ рд╡рд┐рдЪрд▓рди ... 100, рдкреНрд░рдХрд╛рд░ int рдХрд╛ рдореВрд▓реНрдп
рдЖрдЧреЗ рдореЗрд░реА рд╢рд░реНрдо рдЖрддреА рд╣реИ, рдлрд┐рд░ рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╣рд╛рде рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред рдорд╢реАрди рд╕рд░реНрд╡рд░ рд╕реЙрдХреЗрдЯ рдХреЛ рдЙрдард╛рддреА рд╣реИ рдФрд░ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреА рд╣реИ рдЬрдм рддрдХ рдЧреНрд░рд╛рд╣рдХ рдЙрд╕рд╕реЗ рдЬреБрдбрд╝ рдирд╣реАрдВ рдЬрд╛рддрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ рдирдП рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдЬреЛ рдорд╢реАрди рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдЧрд╛ рд╡рд╣ рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛)ред рдпрд╣ рдЕрдм рддрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдкрд╛рд╕ рдЗрддрдирд╛ рд░рд┐рдореЛрдЯ рдХрдВрдЯреНрд░реЛрд▓ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдореИрдВ рдЕрдкрдиреЗ рдмрдВрдж рд╡рд╛рдИрдлрд╛рдИ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реВрдВред
def run(self): TCP_IP = conf.conf.ServerIP TCP_PORT = conf.conf.controlServerPort BUFFER_SIZE = conf.conf.ServerBufferSize self.tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.tcpServer.bind((TCP_IP, TCP_PORT)) threads = []
3.2.2 рд▓реМрд╣ рдкреНрд░рдмрдВрдзрди
рд░рд╛рд╕реНрдкрдмреЗрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, GPIO.BCM рдкрд┐рди рдирдВрдмрд░рд┐рдВрдЧ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдкреНрд░рдХрд╛рд╢ рдХреЛ gpio 17 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ L293 рдкрд░ 2 рдкрд┐рди рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рд░ рдмрд╛рд░ рдХрдорд╛рдВрдб рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ:
GPIO.output(self.gpioLight, GPIO.HIGH)
GPIO.output(self.gpioLight, GPIO.LOW)
рд╕рдВрдЧрдд рдЖрджреЗрд╢ рдХрд╣рд▓рд╛рддреЗ рд╣реИрдВред
рд╕рд░реНрд╡реЛ рдбреНрд░рд╛рдЗрд╡ рдХреЛ I2C рдмрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ PCA9685 рдмреЛрд░реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ Adafruit_PCA9685 ред PCA9685 7 рдкрд┐рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡реЛ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рд╕рд░реНрд╡реЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ PWM рдЖрд╡реГрддреНрддрд┐ 50 рд╣рд░реНрдЯреНрдЬ рдпрд╛ 20 рдПрдордПрд╕ рдХреА рдЕрд╡рдзрд┐ рд╣реИред
рд╕рд░реНрд╡реЛ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд:

рдЬрдм 1.5 рдПрдордПрд╕ рд╕рд┐рдЧреНрдирд▓ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд╣рд┐рдпреЛрдВ рдХреЛ рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред 1 рдмрдЬреЗред рд╕рд░реНрд╡реЛ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрд╕рдВрднрд╡ рд╣реЛ рджрд╛рдИрдВ рдУрд░ рдореБрдбрд╝ рдЬрд╛рдПрдЧрд╛, 2 рдПрдордПрд╕ред рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдмрд╛рдИрдВ рдУрд░ред рдРрд╕реЗ рдШреБрдорд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдкреБрд▓реЛрдВ рдореЗрдВ рд╕реНрдЯреАрдпрд░рд┐рдВрдЧ рдкреЛрд░ рдбрд┐рдЬрд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд░реЛрдЯреЗрд╢рди рдХреЗ рдХреЛрдг рдХреЛ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рдирд╛ рдерд╛ред
рдорд╛рди рдЬреЛ рдХрд┐ Adafruit_PCA9685 API рд╢реНрд░реЗрдгреА рдореЗрдВ 0..4095, 0 рдХреЛрдИ рд╕рд┐рдЧреНрдирд▓, 4095 рд╕реЗ рднрд░реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рддрджрдиреБрд╕рд╛рд░, рдЗрд╕ рд╕реАрдорд╛ рд╕реЗ рдореЗрд░реЗ рдкрд╣рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЪреБрдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдмрд┐рд▓реНрдХреБрд▓ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкрд╣рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ ~ 307 рдХреА рд╕реАрдорд╛ рд╕реЗ 1.5 рдПрдордПрд╕ рдХреЛ рдПрдХ рдореВрд▓реНрдп рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИред
рджрд╛рдИрдВ рдУрд░ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп 245 рд╣реИ, рдмрд╛рдИрдВ рдУрд░ 369 рд╣реИред
рдЬреЙрдпрд╕реНрдЯрд┐рдХ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдорд╛рди -100 рд╕реЗ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ ... 100, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ 245 рд╕реЗ 369 рддрдХ рдХреА рд╕реАрдорд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред рдлрд┐рд░, рдХреЗрдВрджреНрд░ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИ, рдЕрдЧрд░ 0 рдпрд╣ 307 рд╣реИред рд╕реВрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ:
val = int(HardwareSetting._turnCenter + (-1 * turn * HardwareSetting._turnDelta / HardwareSetting.yZero))
- HardwareSetting._turnCenter - 307
- рдореЛрдбрд╝ -100 рд╕реЗ рдЬреЙрдпрд╕реНрдЯрд┐рдХ рд╕реЗ рдореВрд▓реНрдп ... 100
- HardwareSetting._turnDelta - 62, рдХреЗрдВрджреНрд░ рдФрд░ рдкрдХреНрд╖ рдХреЗ рдЕрдзрд┐рдХрддрдо рд╡рд┐рдЪрд▓рди рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ (307 - 245 = 62)
- HardwareSetting.yZero - 100, рдЬреЙрдпрд╕реНрдЯрд┐рдХ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп
рдкрд╣рд┐рдП рд╕реАрдзреЗ:
def turnCenter(self): val = int(HardwareSetting._turnCenter) self.pwm_servo.set(val) CarStatus.statusCar['car']['turn'] = val
рдмрд╛рдПрдВ рдореБрдбрд╝реЗрдВ:
def turnLeft(self, turn): val = int(HardwareSetting._turnCenter + (-1 * turn * HardwareSetting._turnDelta / HardwareSetting.yZero)) self.pwm_servo.set(val) CarStatus.statusCar['car']['turn'] = val
рджрд╛рдПрдБ рдореБрдбрд╝реЗрдВ:
def turnRight(self, turn): val = int(HardwareSetting._turnCenter + (-1 * turn * HardwareSetting._turnDelta / HardwareSetting.yZero)) self.pwm_servo.set(val) CarStatus.statusCar['car']['turn'] = val
рдЗрдВрдЬрди рдирд┐рдпрдВрддреНрд░рдг рднреА I2C рдмрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ PCA9685 рдмреЛрд░реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо Adafruit_PCA9685 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред PCA9685 рдкрд░ рдкрд┐рди 10 рд╕реЗ 15 L298N рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реИрдВ (рдореИрдВ рдЗрд╕реЗ рд╢рдХреНрддрд┐ рдХреЛ рдЕрд╡рд╢реЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2 рдЪреИрдирд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ)ред ENA рдФрд░ ENB рдХреЛ 10 рдФрд░ 11 (рдореИрдВ рдЧрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PWM рдХреЗ рд╕рд╛рде рдЙрдиреНрд╣реЗрдВ рднрд░рддрд╛ рд╣реВрдВ)ред 12, 13, 14, 15 рд╕реЗ IN1, IN2, IN3, IN4 - рдореЛрдЯрд░ рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреА рджрд┐рд╢рд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдкреАрдбрдмреНрд▓реВрдПрдо рдЖрд╡реГрддреНрддрд┐ рдпрд╣рд╛рдБ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ 50 рд╣рд░реНрдЯреНрдЬ (рдореЗрд░рд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореВрд▓реНрдп) рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
рдорд╢реАрди рдЕрднреА рднреА рдЦрдбрд╝рд╛ рд╣реИ:
def stop(self): """ . """ self.pwm.set_pwm(self.ena, 0, self.LOW) self.pwm.set_pwm(self.enb, 0, self.LOW) self.pwm.set_pwm(self.in1, 0, self.LOW) self.pwm.set_pwm(self.in4, 0, self.LOW) self.pwm.set_pwm(self.in2, 0, self.LOW) self.pwm.set_pwm(self.in3, 0, self.LOW)
рдЖрдЧреЗ рдмрдврд╝рдирд╛:
def back(self, speed): """ . Args: speed: 0 1. """ self.pwm.set_pwm(self.ena, 0, int(speed * self.HIGH)) self.pwm.set_pwm(self.enb, 0, int(speed * self.HIGH)) self.pwm.set_pwm(self.in1, 0, self.LOW) self.pwm.set_pwm(self.in4, 0, self.LOW) self.pwm.set_pwm(self.in2, 0, self.HIGH) self.pwm.set_pwm(self.in3, 0, self.HIGH)
рдкрд┐рдЫрдбрд╝рд╛ рдЖрдВрджреЛрд▓рди:
def forward(self, speed): """ . Args: speed: 0 1. """ self.pwm.set_pwm(self.ena, 0, int(speed * self.HIGH)) self.pwm.set_pwm(self.enb, 0, int(speed * self.HIGH)) self.pwm.set_pwm(self.in1, 0, self.HIGH) self.pwm.set_pwm(self.in4, 0, self.HIGH) self.pwm.set_pwm(self.in2, 0, self.LOW) self.pwm.set_pwm(self.in3, 0, self.LOW)
4. рдЧреНрд░рд╛рд╣рдХ
4.1 рдХреАрдмреЛрд░реНрдб
рдЙрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдЙрд╕реЗ рдШрдЯрдирд╛рдкреВрд░реНрдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ (рдпрд╣ ~ 2 рд╕рдкреНрддрд╛рд╣ рдХреА рдкреАрдбрд╝рд╛ рдереА)ред рд▓реЗрдХрд┐рди рдореИрдХреЗрдирд┐рдХрд▓ рдмрдЯрди рдиреЗ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛, рд╕рдВрдкрд░реНрдХреЛрдВ рдХреА рддреЗрдЬрд╕реНрд╡реА рдирд┐рд░рдВрддрд░ рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдиреА (рдирд┐рдпрдВрддреНрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЬреЛ рдореИрдВрдиреЗ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛, рдЬреЛ рдЕрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛)ред рддрдм рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рдиреЗ рдореБрдЭреЗ рдмрддрд╛рдпрд╛ рдХрд┐ рдХреАрдмреЛрд░реНрдб рдХреИрд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЕрдм рдореИрдВ рд░рд╛рдЬреНрдп рдХреЛ рд╣рд░ 0.005 рд╕реЗрдХрдВрдб (рдРрд╕рд╛ рдХреНрдпреЛрдВ, рдФрд░ рдХреМрди рдЬрд╛рдирддрд╛ рд╣реИ) рдХрд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдЕрдЧрд░ рдпрд╣ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдореВрд▓реНрдп рднреЗрдЬреЗрдВред
def run(self): try: while True: time.sleep(0.005) for pin in self.pins : p = self.pins[pin] status = p['status'] if GPIO.input(pin) == GPIO.HIGH : p['status'] = False else : p['status'] = True if p['status'] != status : p['callback'](pin) except KeyboardInterrupt: GPIO.cleanup()
4.2 рдЬреЙрдпрд╕реНрдЯрд┐рдХ
рд░реАрдбрд┐рдВрдЧ рдХрд╛ рдкрдарди ADS1115 рдмреЛрд░реНрдб рджреНрд╡рд╛рд░рд╛ I2C рдмрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп Adafruit_PCA9685 рд╣реИ ред рдЬреЙрдпрд╕реНрдЯрд┐рдХ рднреА рдмрдХрд╡рд╛рджреА рд╕рдВрдкрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреАрдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рд░реАрдбрд┐рдВрдЧ рд▓реЗрддрд╛ рд╣реВрдВред
def run(self): while True: X = self.adc.read_adc(0, gain=self.GAIN) / HardwareSetting.valueStep Y = self.adc.read_adc(1, gain=self.GAIN) / HardwareSetting.valueStep if X > HardwareSetting.xZero : X = X - HardwareSetting.xZero else : X = -1 * (HardwareSetting.xZero - X) if Y > HardwareSetting.yZero : Y = Y - HardwareSetting.yZero else : Y = -1 * (HardwareSetting.yZero - Y) if (abs(X) < 5) : X = 0 if (abs(Y) < 5) : Y = 0 if (abs(self.x - X) >= 1.0 or abs(self.y - Y) >= 1.0) : self.sendCmd(round(X), round(Y)) self.x = X self.y = Y time.sleep(0.005)
3.3 рд╡реЛрд▓реНрдЯ рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрдиреЗ рдкрд░, ADS1115 рдорд╛рдиреЛрдВ рдХреА рд╕реАрдорд╛ 0 рд╕реЗ рдПрдХ рдЬреЙрдпрд╕реНрдЯрд┐рдХ рдХреЗ рд╕рд╛рде рджреЗрддрд╛ рд╣реИ ... 26500ред рдореИрдВ рдЗрд╕реЗ -100 ... 100 рд╕реЗ рд╕реАрдорд╛ рддрдХ рд▓рд╛рддрд╛ рд╣реВрдВред рдореЗрд░реА рд╕реАрдорд╛ рдореЗрдВ 0 рдХреЗ рдЖрд╕рдкрд╛рд╕ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдорд╛рди 5 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ 0 рд╣реИ (рдЕрдиреНрдпрдерд╛ рдпрд╣ рдмрд╛рдврд╝ рд╣реЛрдЧрд╛)ред рдЬреИрд╕реЗ рд╣реА рдорд╛рди рдмрджрд▓рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЯрд╛рдЗрдкрд░рд╛рдЗрдЯрд░ рдкрд░ рднреЗрдЬреЗрдВред
4.3 рдкреНрд░рдмрдВрдзрди рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝рдирд╛
рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝рдирд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрд╛рдд рд╣реИ:
try : tcpClient = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcpClient.settimeout(2.0) tcpClient.connect((conf.conf.ServerIP, conf.conf.controlServerPort)) self.signalDisplayPrint.emit("+") carStatus.statusRemote['network']['control'] = True self.tcpClient = tcpClient except socket.error as e: self.signalDisplayPrint.emit("-") carStatus.statusRemote['network']['control'] = False time.sleep(conf.conf.timeRecconect) self.tcpClient = None continue if self.tcpClient : self.tcpClient.settimeout(None)
рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рдХрдиреЗрдХреНрд╢рди рдореЗрдВ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдлреНрд░реАрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдХреБрдЫ рдорд┐рдирдЯреЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд░реНрд╡рд░ рд╕реЗ рдкрд╣рд▓реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ)ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдХрдиреЗрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ, рдореИрдВ рдЯрд╛рдЗрдордЖрдЙрдЯ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реВрдВред
рдореИрдВ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реВрдВ, рддрд╛рдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓ рдЬрд╛рдП рдХрд┐ рдХреНрдпрд╛ рдирд┐рдпрдВрддреНрд░рдг рдЦреЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред
4.4 рд╡рд╛рдИрдлрд╛рдИ рдХрдиреЗрдХреНрд╢рди рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛
рдореИрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╡рд╛рдИрдлрд╛рдИ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдЕрдЧрд░, рдХрд┐ рдореИрдВ рдЦреБрдж рдХреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВред
def run(self): while True: time.sleep(1.0) self.ps = subprocess.Popen(['iwgetid'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) try: output = subprocess.check_output(('grep', 'ESSID'), stdin=self.ps.stdout) if re.search(r'djvu-car-pi3', str(output)) : self.sendStatus('wifi+') continue except subprocess.CalledProcessError: pass self.sendStatus('wifi-') self.ps.kill()
4.5 рд╡реАрдбрд┐рдпреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛
рдЗрд╕рдХреЗ рд▓рд┐рдП, Qt5 рдХреА рд╕рднреА рд╢рдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА , рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╕реНрдЯреНрд░реЗрдЪ рд╡рд┐рддрд░рдг рдкрд░ рдпрд╣ рдирдпрд╛ рд╣реИ рдФрд░ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИред рдЬреЗрд╕реА рдкрд░ рдореИрдВрдиреЗ рднреА рдХреЛрд╢рд┐рд╢ рдХреАред
рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛:
self.videoWidget = QVideoWidget()
рдФрд░ рд╡рд╣ рдШрдЯрд╛рдпрд╛:
self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.LowLatency) self.mediaPlayer.setVideoOutput(self.videoWidget)
рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди:
self.mediaPlayer.setMedia(QMediaContent(QUrl("http://{}:{}/?action=stream".format(conf.conf.ServerIP, conf.conf.videoServerPort)))) self.mediaPlayer.play()
рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдореИрдВ рдЯреЙрдЯреЛрд▓реЙрдЬреА рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ)ред рдореИрдВ рд╡реАрдбрд┐рдпреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдЕрдЧрд░, рдХрд┐ рдореИрдВ рдЦреБрдж рдХреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВред
рдЬрдм рдпрд╣ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рддреЛ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

- рдбрдмреНрд▓реНрдпреВ - рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡рд╛рдИрдлрд╛рдИ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИ
- рдмреА - рдХрд╛ рдорддрд▓рдм рдХреЛрдИ рд╡реАрдбрд┐рдпреЛ рдирд╣реАрдВ рд╣реИ
- Y - рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЛрдИ рдирд┐рдпрдВрддреНрд░рдг рдирд╣реАрдВ рд╣реИ
рдЕрдиреНрдпрдерд╛ рд▓рд╛рд▓ рдЕрдХреНрд╖рд░ рдирд╣реАрдВ рд╣реИрдВ, рдХреИрдорд░реЗ рд╕реЗ рдПрдХ рд╡реАрдбрд┐рдпреЛ рд╣реИред рдореИрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдлреЛрдЯреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛) рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП рдорд╛рдЙрдВрдЯ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЖрдПрдЧрд╛ рдФрд░ рдореИрдВ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдВрд▓рдЧреНрди рдХрд░реВрдВрдЧрд╛ред
5 рд░рд╛рд╕реНрдкрдмреЗрд░реА рдУрдПрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
рд╡реИрд╕реЗ, рдХреИрдорд░рд╛ рдФрд░ рдЕрдиреНрдп рдЖрд╡рд╢реНрдпрдХ рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рджреЛрдиреЛрдВ)ред OS рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж:

рдФрд░ рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рдЪрд╛рд▓реВ рдХрд░реЗрдВ: рдХреИрдорд░рд╛, ssh, i2c, gpio

рдкреНрд░рджрд░реНрд╢рди
рдХреЗрд╡рд▓ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдЪреИрдирд▓ рд╣реИ (рдХреИрдорд░рд╛ рдХрд╛рдо рдкрд░ рд░рд╣рддрд╛ рд╣реИ)ред рдореИрдВ рдЙрдирдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдореИрдВ рдЗрд╕реЗ рд╕реЛрдорд╡рд╛рд░ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░реВрдВрдЧрд╛ред

рд╡реАрдбрд┐рдпреЛ рдХрд╛рдо:
рд╕реНрд░реЛрдд рдХреЛрдб
рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реНрд░реЛрдд рдХреЛрдб
рдбреЗрдореЙрди рд╕рд░реНрд╡рд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкреИрдХреЗрдЬ
рд╕рдВрджрд░реНрдн
рднрд╛рдЧ 1
рднрд╛рдЧ 3