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
More Decks by mackee
See All by mackee
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
860
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
1.5k
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
6
6.7k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
7.6k
ワンバイナリWebサービスのススメ
mackee
10
9.3k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
930
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時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
280
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
160
Jetpack Compose Mechanisms
skydoves
3
820
個人開発者よ、Honoを使え(おじさんver)
tanahiro2010
2
260
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
380
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
110
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
610
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
180
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
280
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.7k
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
Workers Cache を知る
syumai
0
370
Featured
See All Featured
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
460
The agentic SEO stack - context over prompts
schlessera
0
970
Ethics towards AI in product and experience design
skipperchong
2
440
What the history of the web can teach us about the future of AI
inesmontani
PRO
2
740
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
760
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Utilizing Notion as your number one productivity tool
mfonobong
4
620
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
ڈͷҾ͖ଓ͖શһਓࣄ෦
͋Γ͕ͱ͏͍͟͝·ͨ͠
ී௨ͷϔϦͷΈ
ΫΞουίϓλʔͷ߹ • ্ঢԼ߱ • શମͷճసͷ্͛Լ͛ • ԣͷҠಈ(ϩʔϧ) • ࠨӈͷճసͰ͔ͤΔ •
લޙͷҠಈ(ϐον) • લޙͷճసͰ͔ͤΔ
ΊͪΌͪ͘Ό؆୯ͩʂ
ϔϦͷ߹ • ্ঢɺԼ߱ • ڧ͍ऑ͍ ← Θ͔Δ • લޙࠨӈ •
ʁʁʁʁʁʁʁʁ
ϔϦͷϩʔλʔͷ͚ࠜΛ Α͘ݟͯΈΑ͏ʂ
ϔϦͷϩʔλʔͷ͚ࠜΛ Α͘ݟͯΈΑ͏ʂ
εϫογϡϓϨʔτ • ϩʔλʔͷ֯ճస͢Δ͏ͪʹՄม͢Δ • લʹਐΈ͍ͨ࣌ޙΖͷͱ͖ʹཱͯͯલʹདྷ ͨ࣌৸͔ͤΔ -> ػମ͕͘ • εϫογϡϓϨʔτͳΔ෦Ͱʮ͜ͷ֯ͷ
དྷͨ࣌৸͔ͤΔɺཱͨͤΔʯΈ͍ͨͳͷΛ ܾΊ͍ͯΔ
↑͔͜͜Β্͕ճΔ
͔ͤΔͱΞʔϜͱ ϦϯΫػߏͰ Ӌ͕৸Δ/ཱͭ
ΊͬͪΌෳࡶʂ Ͱඒ͍͠ʂʂʂ