Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
どうしてもPerlでドローンを飛ばしたい人のためのハードウェアハック概論
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
mackee
August 21, 2015
Programming
0
5.6k
どうしてもPerlでドローンを飛ばしたい人のためのハードウェアハック概論
マコピー a.k.a mackee_w
面白法人カヤック
YAPC::Asia 2015 2015-08-21 #yapcasiaC
mackee
August 21, 2015
Tweet
Share
More Decks by mackee
See All by mackee
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
430
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
5
4.7k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
6.3k
ワンバイナリWebサービスのススメ
mackee
10
8.4k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
330
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
1.1k
perl for shell, awk and sed programmers
mackee
3
2.7k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
1k
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
mackee
0
940
Other Decks in Programming
See All in Programming
AtCoder Conference 2025
shindannin
0
1.1k
AI巻き込み型コードレビューのススメ
nealle
2
1.4k
フロントエンド開発の勘所 -複数事業を経験して見えた判断軸の違い-
heimusu
7
2.8k
CSC307 Lecture 07
javiergs
PRO
1
560
AI & Enginnering
codelynx
0
120
Apache Iceberg V3 and migration to V3
tomtanaka
0
170
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
180
それ、本当に安全? ファイルアップロードで見落としがちなセキュリティリスクと対策
penpeen
7
4k
CSC307 Lecture 01
javiergs
PRO
0
690
CSC307 Lecture 02
javiergs
PRO
1
780
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
2k
React Native × React Router v7 API通信の共通化で考えるべきこと
suguruooki
0
100
Featured
See All Featured
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
270
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
280
Everyday Curiosity
cassininazir
0
130
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.3k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
110
Docker and Python
trallard
47
3.7k
Building an army of robots
kneath
306
46k
Producing Creativity
orderedlist
PRO
348
40k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
120
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
950
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
230
Transcript
Ͳ͏ͯ͠PerlͰ υϩʔϯΛ ඈ͍ͨ͠ ਓͷͨΊͷϋʔυΣ ΞϋοΫ֓ Ϛίϐʔ a.k.a mackee_w ໘ന๏ਓΧϠοΫ YAPC::Asia
2015 2015-08-21 #yapcasiaC
͜Μʹͪ
@mackee_w a.k.a Ϛίϐʔ ໘ന๏ਓΧϠοΫ ࣄ ιʔγϟϧήʔϜͷ αʔόαΠυΤϯδχΞ ӡ༻&։ൃ ओʹPerlͱGolang
PR
1िؒલʹϦϦʔε͠·ͨ͠ PR
ʹग़͔ͨ͠Βʹ ͪΐͬͱຊʹͭͳ͍͛ͯ͘ ΜͰ͚͢ΕͲ
Pocket Footballer(PSGI) yellowpages (Go)
ෳͷΞʔΩςΫνϟͰ ׂΛ୲ͯ͠ ҰͭͷతΛୡ͢Δ
ϋʔυΣΞʹಉ͡Α͏ͳ ͜ͱ ద༻Ͱ͖ͳ͍͔ͱ͍͏Λ͠ ·͢
Agenda (લઓ) • ങͬͨΫΞουίϓλʔΛ֎෦͔Βૢ࡞͢Δ • ిؾతհೖ • ͦΕͰμϝͳΒྫ͑ཧͰ͑͜Ή • ΈΜͳେ͖ిͷ
• ͬऔΔͷ͕μϝͳΒج൘͝ͱೖΕସ͑Δ
• ങͬͨΫΞουίϓλʔΛ֎෦͔Βૢ࡞͢Δ • ిؾతհೖ • ͦΕͰμϝͳΒྫ͑ཧͰ͑͜Ή • ΈΜͳେ͖ిͷ • ͬऔΔͷ͕μϝͳΒج൘͝ͱೖΕସ͑Δ
Agenda (લઓ)
͕࣌ؒ༨ͬͨΒΞΠσΟΞϨ ϕϧͰ͕͢ ×ͷ෦Λͦ͏͔ͱ
Agenda (ޙઓ) • ͕ΜͬͯΫΞουίϓλʔΛ࡞Δ • ΫΞουίϓλʔͷߏཁૉ • AmazonͰύʔπΛങ͍ͬͯ͘ • PerlͰૢ࡞ͯ͠ΈΔ
ͬͪ͜ͳΜͱ͔ͳͬͨ ͷͰָ͓͠Έʹ
ങ͖ͬͯͨυϩʔϯΛ ૢ࡞͢Δ
τΠϔϦ(ʙ̎ສԁ)
Parrotͷυϩʔϯ(3ສԁʙ)
DJI Phantom(10ສԁʙ)
Ready To Fly • ϓϩϙ(ૹ৴ػ)ͱຊମ͕ηοτͰೖ͍ͬͯΔౕ • ϖΞϦϯάࡁΈ ௐࡁΈ • తͱۭͯ͠ࡱ
or ඈߦ
ిؾతհೖ
DJI Phantom • ͜Μͳײ͡ͷίϯτϩʔϥ͕ೖ͍ͬͯΔ
DJI Phantom • ͜Μͳײ͡ͷίϯτϩʔϥ͕ೖ͍ͬͯΔ →Ϟʔλʔ ϓϩϙˠ
NAZAͱ͍͏ίϯτϩʔϥ • தͲ͏ͳ͍ͬͯΔͷ͔ෆ໌ • WindowsͰPIDΛ͍͡Διϑτ͕͋Δ͚Ε Ͳɺϓϩτίϧͱ͔Θ͔Βͳ͍ • ϋοΫ͢Δޱͳ͍ͷͰɾɾɾɾʁ
ϒϥοΫϘοΫεతʹ ϋοΫ͍ͯ͘͠
ϓϩϙͷग़͢৴߸ • ݹ͖ྑ͖αʔϘ1ຊʹ͖ͭ1ຊͷέʔϒϧΛ ͏৴߸ = PWM (Pulse Width Modulation) •
ύϧε෯੍ޚ • 0ͱ1ͷ࣌ؒͷ͞ͰΛܾΊΔ
ܗΛݟͯΈΔ
ܗΛݟͯΈΔ ͜͜ͷ෯͕
ϋʔυΣΞߏ
ϋʔυΣΞߏ Firmata (UART) PWM
ೖΔ͔ͳʔೖΔ͔ͳʔ
RaspberryPi͕ͬ͢ΆΓऩ·Δ
Firmata • ArduinoΈ͍ͨͳϚΠίϯͱPCؒͷ௨৴ϓϩτί ϧ UART(Serial)Λ༻͍Δͷ͕جຊ • MIDIϕʔε • ArduinoIDEͷඪ४ϥΠϒϥϦͰ͏͜ͱ͕ग़དྷΔ •
PerlͩͱDevice::Firmata͕CPANʹ͋Δ
ArduinoͰͷPWMग़ྗ • analogWriteͱ͍͏ͷ͕͋Δ͕͜Εແࢹ(0-255 ·Ͱͷ͔͠औΕͳ͍ɻͦͷ͏ͪ͑Δͷ͘͝ Θ͔ͣͰਫ਼͕ѱ͍) • ArduinoʹαʔϘϞʔλͷϥΠϒϥϦ͕͋Δͷ ͰͦΕΛ͏ɻus୯ҐͰॻ͖ࠐΊΔ • ϓϩϙ৴߸௨ৗ1000us
- 2000usͷؒΛऔΔ
RaspberryPiଆͷϓϩάϥϜ • OpenCVΛΈ߹ΘͤΔ্ؔɺ࣮ͷ͋Δ PythonΛ༻ • pyfirmataͰarduinoͱ௨৴͢ΔϓϩηεͱOpenCV ֎෦API͔Βͷૢ࡞Λड͚͚ΔϓϩηεΛ • ͜ͷؒΛੜιέοτ௨৴ͷςΩετϓϩτίϧͰ ΓͱΓ͢ΔΑ͏ʹͨ͠
ϘʔυΛ҆શʹ࡞Δ • Phantomͷͱ͖հೖ͢ΔϘʔυ͕ڰ͏ͱͲ͔ͬඈΜ Ͱ͍ͬͯ͠·͏ͷͰɺΓସ͑Λඪ४ICΛͬͨσΟ εΫϦʔτͷճ࿏Ͱߦ͍ͬͯͨ • 2chϚϧνϓϨΫαICΛԿݸ͔Έ߹Θͤͯ͏PWM ΛεΠον • հೖϘʔυ͕ނোͯ͠ϓϧΞοϓ߅Ͱ͋Δఔͷ
έʔεखಈଆʹΓସΘΔΑ͏ʹ͍ͯͨ͠
ICͷதͷճ࿏͕༨ͬͨͷͰ • ͬͨIC4053Ͱɺ2chϚϧνϓϨΫα͕3ݸ ೖ͍ͬͯͯɺϓϩϙ৴߸4ͭΛΓସ͑Δʹ 2ͭඞཁ • ͔ͦ͠͠ͷ߹2ݸͷճ࿏͕༨Δ
ICͷதͷճ࿏͕༨ͬͨͷͰ • ͪͳΈʹհೖճ࿏पลػثͷIO͕Γͳͯ͘2 ͭͷArduinoΛࠞࡌ͍ͯͨ͠ • Arduinoͷॻ͖ࠐΈʹUARTΛ͏ • ιϑτΣΞͰॻ͖ࠐΈઌͷArduinoΛεΠον ͯ͠ܨ͗ม͑ͣʹεέονΛॻ͖ࠐΉΑ͏ʹͨ͠
લઓऴྃ
Agenda (ޙઓ) • ͕ΜͬͯΫΞουίϓλʔΛ࡞Δ • ΫΞουίϓλʔͷߏཁૉ • AmazonͰύʔπΛങ͍ͬͯ͘ • PerlͰૢ࡞ͯ͠ΈΔ
͕Μͬͯ ΫΞουίϓλʔΛ࡞Δ
ͷલʹɺΫΞουίϓλʔ ԿނඈͿͷ͔ʁ
࣮ͦΕͧΕճసํ͕ҧ͏
࣮ࡍʹճͯ͠Έͯ ԻͰฉ͍ͯΈΔ
ΫΞουίϓλʔͷߏཁૉ ϑϨʔϜ
ΫΞουίϓλʔͷߏཁૉ ϒϥγϨεϞʔλʔ
ΫΞουίϓλʔͷߏཁૉ ESC(Ξϯϓ)
ΫΞουίϓλʔͷߏཁૉ ίϯτϩʔϥʔ
MultiWii • Arduino + WiiϦϞίϯͷ9࣠ηϯαΛ ͬͨΦʔϓϯιʔεϓϩδΣΫτ • ΦʔϓϯιʔεͳͷͰNAZAͱҧͬͯ தΛݟΔ͜ͱ͕ग़དྷΔ
MultiWii
ΫΞουίϓλʔͷߏཁૉ όοςϦʔ
ΫΞουίϓλʔͷߏཁૉ ϓϩϙͱड৴ػ
͜ΕΒΛਖ਼ͭ͘͠ͳ͙ͱඈͿʂ
ϑϨʔϜ
ઢ
ग़དྷͨͷ͕ίνϥͰ͢
ඈͯ͠ΈΔ
্ख͘ඈͳ͍࣌ • ΊͪΌͪ͘Όૢॎ͕͍͠ • খܕͷػମͳͷͰϑΟʔυόοΫ੍ޚΛڧΊ ʹೖΕͯΔඞཁ͕͋Δ • MultiWiiGUI/CUI͔ΒPIDΛ͍͡Δ͜ͱ͕ ग़དྷΔ ->
DΛߴΊʹͯ҆͠ఆ
MultiWiiͷνϡʔχϯά MultiWiiConf
MultiWiiͷνϡʔχϯά https://github.com/c---/MultiWiiCL
ͦͯ͜͠͏ͳΔ
Perl͔Βඈͯ͠ΈΔ
MultiWii Serial Protocol • MultiWiiͱ͍͏ϓϩδΣΫτͷίϯτϩʔϥΛ ͓ͬͯΓɺதΦʔϓϯιʔε • UARTͰίϚϯυܦ༝Ͱͷૢ࡞Մೳ(PIDΛ GUI͔Β͍͡ΔϓϩάϥϜ͜ΕΛ͍ͬͯΔ) •
͔ͤͬ͘ͳͷͰϞδϡʔϧΛ࡞ͬͨ
Device::MultiWii Protocol::MultiWii
͜Μͳײ͡ use Device::MultiWii; my $port = "/dev/tty.usbserial"; my $mw =
Device::MultiWii->new(port => $port); is exception { $mw->open }, undef; my $ident = $mw->fetch_ident; cmp_deeply $ident, { version => 230, multitype => 3, capability => ignore(), };
͜Μͳײ͡ my $rc = $mw->fetch_rc; cmp_deeply $rc, { yaw =>
1500, pitch => 1500, roll => 1500, throttole => 1500, auxs => ignore(), }; $rc->{yaw} = 1400; ok $mw->set_raw_rc(%$rc); $refetched_rc = $mw->fetch_rc; cmp_deeply $refetched_rc, { yaw => 1400, pitch => 1500, roll => 1500, throttole => 1500, auxs => ignore(), };
ৗʹૹΓଓ͚ͳ͍ͱ ϓϩϙ৴߸Ͱ্ॻ͖͞ΕΔ
MSPʹΑΔRC্ॻ͖ͷΈ MSP(UART) PWM
MSPʹΑΔRC্ॻ͖ͷΈ 1. MSPͰRC্ॻ͖
MSPʹΑΔRC্ॻ͖ͷΈ 1. MSPͰRC্ॻ͖ 2. Χϯλ͕50ʹηοτ͞Εͯ ͦͷ্ؒॻ͖
MSPʹΑΔRC্ॻ͖ͷΈ 1. MSPͰRC্ॻ͖ 2. Χϯλ͕50ʹηοτ͞Εͯ ͦͷ্ؒॻ͖ ←͜ͷΧϯλ͕ ҰॠͰ0ʹͳΔʂʂʂ
MSPʹΑΔRC্ॻ͖ͷΈ 1. MSPͰRC্ॻ͖ 2. Χϯλ͕50ʹηοτ͞Εͯ ͦͷ্ؒॻ͖ ←͜ͷΧϯλ͕ ҰॠͰ0ʹͳΔʂʂʂ 3. ͬͪ͜ͷ৴߸Ͱ
্ॻ͖͞ΕΔ
֘෦ͷίʔυ if (chan<8 && rcSerialCount > 0) { rcSerialCount --;
#if defined(FAILSAFE) failsafeCnt = 0; #endif if (rcSerial[chan] >900) { rcData[chan] = rcSerial[chan]; } }
͜͏ม͑ͨίʔυ if ( chan<8 && (rcData4Values[AUX1][rc4ValuesIndex] > 1800 || rcSerialCount
> 0)) { rcSerialCount --; #if defined(FAILSAFE) failsafeCnt = 0; #endif if (rcSerial[chan] >900 && (chan == ROLL || chan == PITCH || chan == THROTTLE || chan == YAW)) { rcData[chan] = rcSerial[chan]; } }
AUXΛεΠονϯάʹ͏ • εςΟοΫҎ֎ʹ͍Ζ ͍ΖεΠονͱ͔͍ͭ ͍ͯΔ͚ΕͲɺ͜Εͷ ૹ৴Ͱ͖Δ -> AUX • ࠓճӈ্ͷεΠον
ΛAUX1ʹׂΓͯͨ
ͯ͞Perl͔Β͑ΔΑ͏ʹ ͳͬͨͷͰ
Q: Perl͕ಈ͘ೖख༰қͷதͰ ͬͱϑοτϓϦϯτখ͞ ͍ίϯϐϡʔλʁ
Raspberry Pi
Raspberry Pi 85.60 mm × 56.5 mm
Raspberry Pi 85.60 mm × 56.5 mm
Intel Edison
Intel Edison 35.5mm × 25.0mm
Intel Edison + Breakout Board 61mm x 29mm
Intel Edison + Breakout Board 61mm x 29mm
Intel Edison • 500MHz Atom σϡΞϧίΞ (x86ͩʂʂʂʂ) • ϔϦͱͯ͠7V -
15Vͷిݯ͕৯͑ΔͷͰ3 ηϧLiPo12V͕ͦͷ··৯͑Δͷ͕͏Ε͍͠ • RasPiʹ͍͍ͭͯͳ͍WiFi ͱ BT ͕͋Δ
Intel Edison meets MultiWii • EdisonUARTΛ2ܥ౷͍࣋ͬͯΔ͕Ϩϕϧม͕ ඞཁ(1.8V IO)ͳͷͰOTGέʔϒϧͰUSB-UARTม Λհͯ͠ଓɻϋϯμ͚ෆཁͩʂ •
Breakout boardఈ໘ʹ2.54mmϐονͷϗʔϧ͕ ۭ͍͍ͯΔ͕͜ͷஔͩͱϒϨουϘʔυʹͤ͞ ͳ͍ͷͰळ݄ిࢠͷมϘʔυ͕࣮ݧ༻ʹ͓͢ ͢ΊͰ͢
ىಈͯ͠ΈΔ (ةͳ͍ͷͰӋͳ͠Ͱ͢)
EdisonʹೖΕͨͷ • plenv (System PerlͷίΞϞδϡʔϧ͕ශ૬Ͱ opkgͰಥͬࠐΈ·͘Βͳ͍ͱ͍͚ͳ͍) • mackerel-agent(ωλɻόοςϦʔిѹͱ͔ ߴͱ͔ܭଌͰ͖ͨΒ͍͍͔͛ͯ)
Slack௨ೖΕ͍ͯΔͷͰ ى͖Δ·ͰͬͯΈ·͢
جຊCRITICALͰىಈͨ࣌͠ʹ OKʹͳΔײ͡Ͱ૽
Perl͔Βૢ࡞͢Δ͚ͩͰ Γͳ͍ͷͰ ͪ͜ΒΛPerlͰಡΈ·͢
LeapMotion
LeapMotion • Ұ࣌ظΛฉ͔ͳ͘ͳΓ·͕ͨ͠ɺࠓͰ OculusͳͲͷVRϔουηοτʹ͚ͯࣗͷ खΛVRʹු͔ͤΔ༻్Ͱ෮ݖ͖͍ͯͯ͠Δ • ࠷ۙਫ਼্͕͕ͬͨΒ͍͠(͍ͭ࠷ۙങͬͨͷ ͰΑ͘Θ͔Βͳ͍Ͱ͕͢……)
LeapMotion x QuadCopter • WebSocketͰܨ͛ΒΕΔͷͰPerl͔ΒͰ ใΛऔΔ͜ͱ͕ग़དྷΔ • ͜͜ͰAnyEvent::LeapMotionΛ͏ • ϓϩϙ͡Όͳͯ͘खͷͻΒ͚ͩͰු͔ͤͯΈ
Δ
σϞ
݁ߏݫ͍͠ɾɾɾ
None
1. खͷ͖ΛऔΔ
1. खͷ͖ΛऔΔ 2. Edisonʹཱ͍ͬͯΔPSGIʹ ϦΫΤετΛ͛Δ
1. खͷ͖ΛऔΔ 2. Edisonʹཱ͍ͬͯΔPSGIʹ ϦΫΤετΛ͛Δ 3. PSGIͷதͰDevice::MultiWiiʹ ॻ͖ࠐΈ
1. खͷ͖ΛऔΔ 2. Edisonʹཱ͍ͬͯΔPSGIʹ ϦΫΤετΛ͛Δ 3. PSGIͷதͰDevice::MultiWiiʹ ॻ͖ࠐΈ 4. ΪϡΠϯΪϡΠʔϯʂ
·ͱΊ • ϋʔυΣΞϋοΫʹ༷ʑͳํ๏͕͋Δ͕ɺ Γத͕͔͍ͬͯΔͷΛͬऔΔͷ ͕Ұ൪༰қ͍ • υϩʔϯ࡞ΕΔɹΈΜͳ࡞Ζ͏ • Perl͔Βૢ࡞Ͱ͖Ε͍ΖΜͳ͍͍͜ͱѱ͍ ͜ͱ͕ग़དྷָ͍ͯ͠Ͷʂ
ϙέοτϑοτϘʔϥʔͰݕࡧ PR
ڈͷҾ͖ଓ͖શһਓࣄ෦
͋Γ͕ͱ͏͍͟͝·ͨ͠
ී௨ͷϔϦͷΈ
ΫΞουίϓλʔͷ߹ • ্ঢԼ߱ • શମͷճసͷ্͛Լ͛ • ԣͷҠಈ(ϩʔϧ) • ࠨӈͷճసͰ͔ͤΔ •
લޙͷҠಈ(ϐον) • લޙͷճసͰ͔ͤΔ
ΊͪΌͪ͘Ό؆୯ͩʂ
ϔϦͷ߹ • ্ঢɺԼ߱ • ڧ͍ऑ͍ ← Θ͔Δ • લޙࠨӈ •
ʁʁʁʁʁʁʁʁ
ϔϦͷϩʔλʔͷ͚ࠜΛ Α͘ݟͯΈΑ͏ʂ
ϔϦͷϩʔλʔͷ͚ࠜΛ Α͘ݟͯΈΑ͏ʂ
εϫογϡϓϨʔτ • ϩʔλʔͷ֯ճస͢Δ͏ͪʹՄม͢Δ • લʹਐΈ͍ͨ࣌ޙΖͷͱ͖ʹཱͯͯલʹདྷ ͨ࣌৸͔ͤΔ -> ػମ͕͘ • εϫογϡϓϨʔτͳΔ෦Ͱʮ͜ͷ֯ͷ
དྷͨ࣌৸͔ͤΔɺཱͨͤΔʯΈ͍ͨͳͷΛ ܾΊ͍ͯΔ
↑͔͜͜Β্͕ճΔ
͔ͤΔͱΞʔϜͱ ϦϯΫػߏͰ Ӌ͕৸Δ/ཱͭ
ΊͬͪΌෳࡶʂ Ͱඒ͍͠ʂʂʂ