Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
どうしてもPerlでドローンを飛ばしたい人のためのハードウェアハック概論
Search
mackee
August 21, 2015
Programming
5.7k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
どうしてもPerlでドローンを飛ばしたい人のためのハードウェアハック概論
マコピー a.k.a mackee_w
面白法人カヤック
YAPC::Asia 2015 2015-08-21 #yapcasiaC
mackee
August 21, 2015
Transcript
114 slides
Ͳ͏ͯ͠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
ڈͷҾ͖ଓ͖શһਓࣄ෦
͋Γ͕ͱ͏͍͟͝·ͨ͠
ී௨ͷϔϦͷΈ
ΫΞουίϓλʔͷ߹ • ্ঢԼ߱ • શମͷճసͷ্͛Լ͛ • ԣͷҠಈ(ϩʔϧ) • ࠨӈͷճసͰ͔ͤΔ •
લޙͷҠಈ(ϐον) • લޙͷճసͰ͔ͤΔ
ΊͪΌͪ͘Ό؆୯ͩʂ
ϔϦͷ߹ • ্ঢɺԼ߱ • ڧ͍ऑ͍ ← Θ͔Δ • લޙࠨӈ •
ʁʁʁʁʁʁʁʁ
ϔϦͷϩʔλʔͷ͚ࠜΛ Α͘ݟͯΈΑ͏ʂ
ϔϦͷϩʔλʔͷ͚ࠜΛ Α͘ݟͯΈΑ͏ʂ
εϫογϡϓϨʔτ • ϩʔλʔͷ֯ճస͢Δ͏ͪʹՄม͢Δ • લʹਐΈ͍ͨ࣌ޙΖͷͱ͖ʹཱͯͯલʹདྷ ͨ࣌৸͔ͤΔ -> ػମ͕͘ • εϫογϡϓϨʔτͳΔ෦Ͱʮ͜ͷ֯ͷ
དྷͨ࣌৸͔ͤΔɺཱͨͤΔʯΈ͍ͨͳͷΛ ܾΊ͍ͯΔ
↑͔͜͜Β্͕ճΔ
͔ͤΔͱΞʔϜͱ ϦϯΫػߏͰ Ӌ͕৸Δ/ཱͭ
ΊͬͪΌෳࡶʂ Ͱඒ͍͠ʂʂʂ
More Decks by mackee
See All by mackee
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
890
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
1.6k
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
6
6.9k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
7.7k
ワンバイナリWebサービスのススメ
mackee
10
9.4k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
990
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
1.2k
perl for shell, awk and sed programmers
mackee
3
3k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
1.2k
Other Decks in Programming
See All in Programming
AI駆動開発4年目の現在地(『あなたはFDEになるべきか?』イベント資料)
kumaiu
0
590
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
5
820
Goコンパイラを作ってGoをもっと理解する / Build a Go compiler to better understand Go
ikura_hamu
0
130
Spec-Driven Development - Why Vaadin Is the Perfect Fit
simas
PRO
0
240
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
740
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
420
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
15
11k
PyConTW 2026 - AI Coding 不只是工具升級, 區域醫院醫療資訊系統協作開發與資訊團隊轉型實踐
cclai999
0
250
flutter_test のその先へ — Flutter アプリの LLM 機能に「評価」という品質保証を
kosukesaigusa
0
200
React Native経験者が Flutterを30⽇間触って驚いたこと
3saito
0
170
Web Framework Benchmark Battle 2026, Any%
a_matsuda
3
3.2k
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
330
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
31
7k
YesSQL, Process and Tooling at Scale
rocio
174
15k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
3k
Building an army of robots
kneath
307
47k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
560
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
600
What the history of the web can teach us about the future of AI
inesmontani
PRO
3
800
Chasing Engaging Ingredients in Design
codingconduct
0
390
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3.1k
Music & Morning Musume
bryan
48
7.5k
A Soul's Torment
seathinner
9
3.9k