You are on page 1of 19
OPEN SOURCE GAMING GAZINE BASED ON ARDUINO Vol. 2 Ela 4en We MAKE & SHARE GAMES Sa ee Romp toy ad ol Ema ca tel LEARN Tips & Tricks with Team A.R.G Squeezing Bits to maximise your code with JO3RI Game design with crait EXPLORE =x 10 Questions with Game Developer WangRenxin * : EE Find out how last month's featured game came to be... EVADE Arduboy Workshop in Medway A welcome note: + Well, this is Volume 2 of Arduboy Magazine. We macie it. We'd like to thank all of you that read it, to be precise, a whole 620 of you read it! We are really humbled. So here's to another 620! aii x RED This month we have been getting up to getting one sa some community polls, and we even stepped out there and invested our time into some new articles, JO3RI’s bit squeezer and Fresh New Games are both new ones for you to enjoy. |hope you have fun reading this volume, it was certainly fun to make. Why not come and join the fun here at Arduboy Magazine? Send us an email at joinus@ arduboymag.com to learn more. Have a good one. -@widehaslet FE) @JO3RI: Better known as TEAM A.R.G, some of Arduboy's community favorite games such as Mystic Balloon and Shadow Runner are written by them, as well as their own Arduboy Game Loader, where you can easily upload your favorite Team A.R.G games without using the Arduino IDE. hitp://www.team-arg.com/ @crait: Creator of various Arduboy games such as Circuit Dude and Train Dodge, crait has written tutorials on how to get started with creating your own game, and developed Arduboy Manager, an easy way to upload games to your Arduboy without using the Arduino IDE. hitp://www.crait.net/ @Dmian: This talented graphic & web Designer from Madrid, Spain created the Magazine's Logo and various icons. hitps://damianvila.com/ @hvard_olivier: Thank you Olivier for the cute pixel Arduboys! Graphics, webdesign, pixelart and much more at: ‘www.0olivierhuard.com Do you wish to contribute? Have an interesting article you wish to share with the Arduboy community? A cool project you did, your experience on working on it? A funny joke? We want fo hear it! Send us an email at joinus@arduboymag.com Page 2 of 19 Arduboy Company news: What’s happening at headquarters? @Celinebins Gol your Arduboy set up and want to start playing games, but not sure which one to start with? Visit the Youtube Channel and watch games being played and reviewed by Kevin Bates in our new segment “Let's Play Arduboy. Follow the channel and get notified when new reviews are out! Where to buy one? In order to better deliver the Arduboy to you, a distribution model for sales has been currently implemented. You can now purchase the Arduboy from a variety of different retailers from around the world! AC GEARS Ba tecH Wadatrui “iwesrd € FabxFab PIMORONI Eg eR Pe a [p b ri IL. robotics at your service! ® ROboFun = wes: (yseeed tha %yt iat Peel oe Page 3of 1? ARtitlery ByBeraasris{)!| > by @Celinebins So many new games were released this month! If you missed them on the community pages, here they are. THAT WILL GET you HOOKED ARDUMINER @bergasms A clone of Terraria or Minecraft in 2D. Make your way throuhh the randomly generated levels 16 wide by 64 deep. ARCODIA @TheArduinoGuy Battle each wave of different enemies to beat in this space shooter game. Be careful you only have 5 lives! ARTILLERY @bergasms A remake of the classic Tanks game, change gun angle and choose the power of your shots to defeat your opponent. CASTLEBOY @dir3kt and @Increment A remake of Castlvania. Armed with a whip and some knives, jump and dodge to collect coins and defeat the bad guys! Page 4of19 HEDLA @twedked Stay alive in this side scrolling game by jumping over hurdles, collect twice the amount of point by jumping to collect coins too. More info about the dev here: http://odindutton.com/hrdir-arduboy/ JET PAC @TheArduinoGuy You are an astronaut on an alien planet with a Jet Pac. Assemble and fuel your rocket while avoiding the obstacles and baddies to stay alive, POCKET FIGHTER @WwangRenxin Pocket Fighter is an fighting game where you compete with your Arduboy. The “opponent” will repeat your actions at previous level. QUADRASTIC @dragula96 and @darkaozZ Secure points as you move around the playing field avoiding the enemy boxes. Each point collected will reveal a new enemy. TRES = TILE GAME @cajogold A clone of Threes! game. Move the "1", "2" and *3" tiles around the screen to - match the numbers and extend your " gameplay. Want us to feature your game? Write in to us with your game, how you made it, and any- thing else you want the community to know! Page 5 of 19 This month we took to th asked you what your fav We got 89 votes anc Circuit T(_joue iti CIRCUIT DUDE by @crait You help Circuit Dude build an awesome invention by leading him through 50 unique levels. Your progress can be saved to continue at a later time, perfect for when you want a small puzzle fix during the day. BALLOON by Team ARG (@Gaveno) You navigate a kid to collect coins and avoid his ‘enemies. Not just a side scroller, the balloons are used to float away from danger and to safety. You are also able fo save your progress here. a ¥FIRUS LOP=?79 by Team ARG (@J03RI & @fuopy) Your neighborhood has been over run by zombies! Use your gun to shoot zombies as you save your neighbors from doom. Each level has a new maze to run through, making this game super addictive. HOLLOW SEEKER by @obono A simple side scroller that you have to seek hollows for refuge and avoid getting crushed. Simple but you are hooked constantly trying fo better your high score. Page 6 of 19 Others: Arduminer (@bergasms), 6% tacker (@dragula), 6% ross (@dragula), 6% 'dragula), 6% ive! (@Andre3000), 6% é community pages and orite Arduboy games are. Fanboat (@fanboat), 3% these are the results! Burgardlime (@pixelplatforms), 3% Rodger Dodger (@dantaro), 3% SL @crait), 3% TRAIN DODGE by @crait Test your reflexes by jumping off the tracks. BLOB ATTACK by Team ARG (@JO3RI) 4 SEMA Match the blobs to WS F2uaF10 by @chris E¥ADE FEB 6y modus Create (@1ayGarcia and @simonprickel) Read ihe ‘asi on the game's development ™ clear them before they fill up the screen. ‘SHADOW RUNNER by Team ARG (@JO3RI) You are a running across the country side, but remember to jump over the rocks and slide under the birds. mt JET Pac by @TheArduinoGuy You are an astronaut and just landed on a planet. Use your Jet Pac to collect ship parts and fuel packs before flying off to the next level. Amazing sound effects! Fun far rduboy is the 6th *Results from 26th Feb 2017 platform Hollow Seeker is on! Page 7 of 19 LEARN: In this topic we would like to present you some tips & tricks to help you code your games for Arduboy. intend to 's just a way, What we present doesn be the absolute truth, we al TEAM arg. code. So always remember, these are not golden rules. APES een by @jo3ri In our previous article, we explained how to use multiple files, this time | would like to talk about defines and why we use those and also about the naming of variables, functions and defines. The easiest way to look at a define is to see it as a placeholder, it defines a constant (a value that can't be changed). Once you compile your game/app, all defines will be replaced by the actual value you defined it with Always put those defines in top of your file, right below the includes. If you're going to use the defines in multiple files, remember to place them in the globals.h (see previous “tips & tricks” issue 1). Here you have an example: Here we defined the top and bottom of our screen, so now we can use those to limit a sprite from going over those limits, when we for example press a button. functions & defines if (arduboy.pressec(DOWN_UP)) if (player.y > TOP_OF_THE_GAME) { player.y- } I (arduboy.pressed(DOWN_BUTTON)) if (player.y < BOTTOM_OF_THE_GAME] ‘ playery++: } When testing this, you'll find out that even though, we added a bottom limit, your sprite will walk off screen. Why? We forgot to include the height of our sprite. Let's say our sprite is 16x16 pixels. Remember, we always start calculating from the top, left comer. to be continued next page >> PageBof19 This means we should actually stop our sprite from moving 16 pixels BEFORE the bottom. We could replace 64 by 48, but we can also add-in the sprite height. _THE_GAME A_OF_THE. WOW, a calculation ? Doesn't that take up bytes or RAM 2 Nope, it doesn't, because the compiler will replace and calculate all defines on compilation. Remember defines are NOT variables, they are placeholders. you'll find out, that using those placeholders will help you a lot, when your code starts growing and you use them over multiple files and in different places. Changing a value in a define is a lot easier, than when you have to change it at different places in your code. But there is more to a define, you can also use it to create a macro. Macros are tricky. I'll give you a simple example and if you want to read more about them, | suggest you go read about those online here. in the example, we'll create a macro for adding 2 values. in your code you can now use this macro to add two values. This is indeed a very simple example, but macros are a bit hard to debug, so | suggest you don't use them, unless you're already deep into coding. areal) Let's continue with naming. If you really want to follow strict naming conventions, you better read about those on the intemet too. We're only going to describe the simple rules. By now you must have seen that we have put alll defines in capitals. You must also have noticed, that we used underscores to separate words. We never use abbreviations, but stil try 10 be as short as possible. Next let's have a look at the variables. We want a variable to explain what itis, but don't want to use verbs. So frameCounter is a variable, that we use to count frames. Yes, the first letter isn't a capital, it's lowercase, but the next word has a capital. We don't use underscores to distinct the different words, we use capital. This way of writing is called CamelCase. We do the exact same thing for a function, But the biggest difference is, we do use a verb in the naming, like drawPlayer. The downside of using this long names with the Arduino IDE is that it doesn't recognize names you've already used before. This is where other programs like “Sublime Text” do a much better job, Have fun coding your games and next time we'll talk about #define and why we use those and also about the naming of variables, functions and defines. Page 90f19 In this “small” part of the magazine | would like to tell you about the possibilities you have to reduce coding size when creating your app/game. by JO3RI by @jo3ri Every issue I'll give you a new suggestion on how to get the most out of your code using the least of bytes. Remember you always have to test these tips and compare compiled size before and after these kind of tricks. In this issue let’s see how you can reduce size when counting frames, sprite frames for example. When creating a sprite with different frames, you'll probably create a function that will run through those frames and when reaches it maximum, it will start over again. It might look like this: void drawPlayer) { if (nextFrame(4)) player.frame++: if (player frame > 3) player frame = 0; sprite.drawWithMask(player.x, playery, playerSprite, player.frame); } This function will draw the playerSprite and will also rotate through it's 4 sprites used for the walking animation. It will do this by adding | to the player.frame every time it passes. Once player jrame is bigger than 3, it will be set to 0 again. It might look like there's no more room for reducing compiled sized, but there is. Try this code as a replacement: Void drawPlayer|) ti if (nextFrame(6)) player.frame = (++player frame) % 4; sprite.drawWithMask(player.x, playery, playerSprite, player.frame); } The above code does the exact same thing, but uses less bytes. It uses modulo... We still add 1 every pass, but we only keep the rest of a division by 4. to be continued next page >> Page 10of19 And an other way reducing, is by using the same frameCounter for every animated sprites, like enemies, instead of having a separate one for every individual sprite. Mind you, they will animate at the same speed and start with the same frame. But don't worry, we can still change this. We can have a different frame amount, or even step in at a different frame number. Confused @ Have a look at the example: void checkFrameCount() { if (nextFrame(4)) globalFrameCounter++; } void drawPlayer() { sprite.drawWithMask(player.x, player.y, playerSprite, globalFrameCounter % 4); } void drawEnemies() { for (byte i= { sprite.drawWithMask|enemy/i].x, enemy|i]._y, enemySprite, (globalFrameCounter + i)% 8); } } s1< 6: +4) ‘As you can see, we now used only 1 byte for our frameCounter, which we use for animating our player sprite and 6 enemy sprites. This time we have put the modulo in the draw function itself. This gives us the possibility to use a different modulo for each draw function. 4 frames for the player sprite and 8 frames for the enemy sprites. But we added something extra in the enemy frame count. Because we didn't want every enemy sprite to start with the same frame {and animate like clones), each enemy animation will start will the next frame (by adding + i). To make their animation look even more ditferent, you could multiply by an uneven number: +(3*i) Voila this a small way of reducing bytes, but by following or monthly bit squeeze tips, you'll soon find out you can gain alot of bytes, by doing this kind of bit squeezing. Pagel1of19 by crait Programming a video game can be fun, but once you create a few games, sometimes you can feel bumt out and not really know what fo do next. Maybe you're a beginner and you don't really know how to come up with your own game. Either way, you can follow this quide to help come up with a game concept. In last month's issue, | talked about feasibility as well as a few of the most popular inspirational tools in creating a video game: Stealing, mixing, experimenting, and a little on design. This month's article will be an elaboration on the design. If you remember from last month's issue, | said that the design method would be what | called the seemingly more professional and stereotypical design process for creating games. Since this article is focused more on game design hobbyest or newbies, | won't mention design documents or focus testing or any of those expensive (and sometimes more boring) pars of the process. Instead, this article will be about the concepts of and process of designing a feasible game. My biggest piece of advice that | can give to new game designers is to make something that is easy. IFit's easy, you'll get familiar with the process, making you better at making games. Harder games will become easier to make with time, so your dream game will eventually be within your reach! Stay within your abilities for the first few games. As someone who has programmed and designed a lot of different games, | can tell you that even for seemingly-easy projects, there have been times where surprises pop up that | had not even considered that made my easy projects a lot harder and take longer. What | often ask people is, "Would this game be easy for you to make?" If the answer is a “no,” then you are likely setting yourself up for failure and probably won't finish the game. Even if you answer “maybe,” you are still likely to be setting yourself up for failure. Even whenever you are a master at designing and programming games, you won't work on games that are “too hard” for you. Remember, the easier a game is to make, the more feasible itis to finish. If the game seems easy for you to make, then there is 0 reason why you should give up! Don't throw your ideas away! You can do it! While we're talking about feasibility, | want to briefly remind you to consider which system you're designing a game for. If you're working on the PC, you'll have a lot more options in terms of what kinds of games you can design than if you were designing a game for the Atari 2600. Why? Well, there are more input options on the PC, better graphics, faster hardware, more memory, the ability to connect to the intemet, and much more. When designing game, you want to make sure that the platform can support the features you want in your game. This brings me to a very important topic, which is goals. A lot of times, this is subconscious! What are your goals for this game? Are you designing a game to impress friends? Are you designing a game fo improve your programming skills? Are you designing a game to learn more about a new platform? Why are you designing a game? Of course, | can't hear you through an e-zine, but you can think about this to yourself! Do your goals line up with the feasibility of this game? to be continued next page >> Page 12 of 19 The next thing | want you to know is that game design can sometimes be difficult. it's okay to try to design a game and have it turn out to be lame or not fun Plenty of companies have spent millions of dollars on game concepts that weren't fun! Don't let this discourage you! | made many games before | ever made my first fun one! Hopefully with this tutorial, | can teach you alittle bit about how to avoid that, though. © Gameplay is incredibly important to a game. If you remove it, then the game is no longer a game. When designing game, this can be helpful to keep in mind. There's a lot of games that have been created in order to look nice and get people's money, but because the gameplay mechanics were terrible, people hated it. That's one of the reasons | want you to know that you shouldn't worry too much about production value of the game. It doesn't need to look amazing or sound great as long as you implement the gameplay! Remember, there are a lot of fun games that have great game mechanics that also have very simple graphics and limited features, like Tetris or Simon! This is good news for your game's feasibility! if you've got a great idea for a game and want to implement it, here's another quick tip: Cut out almost every feature. You heard me right! Start by creating a demo of your game that has the basic game mechanics working. Don't spend weeks implementing special sprites or animations when you haven't even determined if your game is even fun or not! Anything that isn't absolutely necessary to gameplay can be cut out of your work load. Try only have one level in your game and maybe use squares instead of sprites. Creating a demo will aliow you to test to make sure your game is heading into the right direction or if your mechanics need some adjusting. You can even have friends and family demo the game at this point, as well Okay, now that I've got these things out of the way, | can tak more about the fun part of designing your own game! The process of researching, coming up with your own game design, experimenting with it, and coming up with its theme is called ideation. Sometimes, this ideation phase can be very personal or can be a group activity The game's theme is the aesthetics of the game and can even include many story elements. Think of it as the color you paint a car. You can always paint a car different colors or patterns, but it can still retain its same use. Sometimes, certain cars happen to look better with certain paint jobs and sometimes, cars don't have Paint. My point is that some games have the exact same gameplay or mechanics as others, but have different themes. When designing a game, you can come up with a theme first, or apply a theme to.a set of mechanics that you come up with beforehand. It’s ke the grand, old question about a chicken and its egg- No one really knows which comes first. It's important to be able to come up with a game that can have its theme removed because you have to be able to understand the gameplay mechanics behind the game. When creating your first game, it is even a good tip to focus almost entirely on gameplay and very, very little on the game's theme. Like | said earlier, you want fo get rid of as much as you can to test the mechanics. In next month’s article, | will elaborating on coming up with the mechanics for your game and maybe how to come up with @ unique theme for it, as well. | know this article may be a little boring compared to the first, but these things are really important! @ They'll all come together and make a lot more sense by next issue. Until next time, take care, keep 6X ‘expirementing, and be sure to. share your game ideas on the Arduboy community forum! Page 13 of 19 EXPLORE: ep GUEST IOS ea GELS DEVE LOFERS by @widehaslet This time we presented our 10 questions to WangRexin, newly joined member in the community, and just released his new game - 1 Fighter Ta s a il a3 1. Where did you find out about Arduboy the first time? I'm a retrocomputing/retrogame fan, my job is programming, so | knew Arduboy by searching the internet with “arduino game console" or something like that. 2. What is the first program/game you created for Arduboy @ { Othello. Programming an Arduboy is more challenging than playing with it. 3. Did you have app/game developer experience before Arduboy ? Yes, | used to program video games for the industry for many years, and | have some experience with embedded systems. Now game programming is one of my biggest hobbies. 4, What programs do you use for creating Arduboy apps/games ? Besides the Arduino IDE and Arduboy lib, luse the @emutyworks's Bitmapéditor to create pixel images. Thanks for everyone who have make all this possible. 5. What do you read to learn how to code for Arduboy ? | already have some experience with Arduino before | got my Arduboy, it's necessary to learn some fundamental. Then | read the header files of the (Arduboy2) lib, it’s well documented in the comment, and the API itself is clarified. 6. What app/game do you have currently on your Arduboy ? Circuit Dude, play through one or wo levels once | got time. 7. What Arduboy app/program is your favorite ? Circuit Dude, the graphics is nice, and the gameplay is pretty welll designed. 8. What is the next app/program for Arduboy from your hand we can expect ? A FIG, with which you may have a lot fun by playing against the Arduboy. Still an early stage. to be continued next page >> Page 14 of 19 9. What app/game would you love to see on the Arduboy ? Roguelike! Roguelike! Roguelike! 10.What is your best tip for other people who want to start creating apps/games for Arduboy 2 Try everything you know from scratch or Are you a developer and want to based on other's program, then build your be featured here? Reach out to own from a small point to. a complete one. the Magazine through Twitter DM Don't be afraid of making mistakes. @arduboymag SEE? CEES 5 ccainevins The Arduboy is durable, but that does not mean that it's totally stratch-proof, especially if its been tossed in a backpack full of other dangerous stuff (ike keys!). So we took to the community to find out how some users are keeping their Arduboys safe. j @WangRenxin: @Jutleys: Gota Bought a monogramed genuine card case, and leather the best part? “it case and can even hold puta several more Pebble business cards." screen protector. Perfect fit! @jedgarpark: “He couldn't have!” La cB “He did.” @crait: “| 3D printed my @phil8715: Keeping *gasp* ‘own case and put felt his Rail pass and Handmade leather ‘on the inside to protect it rail entertainment #Arduboy case. from scratches.” handy Page 15 of 19 For Modus Create's 2016 Christmas Gift, they decided that they would make something unique that spoke to what they do best. After choosing Arduboy as their hardware platform, they then decided to build a side scrolling space shooter game. This article is taken from the Modus Create blog written by @TimothyEagan and @simon_prickett Alien Invasions and Weapons We decided to set out and build a game where the player is escaping from an alien invasion, and would face waves of enemies including three different “bosses”. The ship would have a weaker unlimited weapon, and a stronger limited weapon that needs “recharging” Multiple enemies would be faced at atime, with different types of enemies requiring different numbers of hits to kill them. The player's ship can be destroyed by a single hit from any enemy: fo combat this fragility we decided to give the player four lives and to make their ship and weaponry a little faster moving than that of the enemies. Bosses and Levels We also wanted to add "bosses" — larger, tougher enemies that the player has to face at strategic points of the game. We also wanted this to be an “infinite” game, so after the user has beaten all the enemies and bosses once, they get to do it all over again. Scores would be kept rather than having “levels”. The player earns points for staying alive, with extra points for each regular enemy that they shoot down and bonus points for beating a boss. In keeping with the retrogaming / arcade spirit, we chose to implement a classic “3 initials" high score table, and give the the game fast paced music that changes when the player faces off against a boss. Game Programming on the Arduboy Developing for Arduboy is largely similar to developing for Arduino, but focussed on gaming applications due to the nature of the inputs available (six buttons}. The open source Arduino IDE provides a basic code editing environment for the C language. compiling it, and uploading it. Arduino Libraries There are a couple of libraries that wrap the low level calls to manage the hardware for things like detecting a button press, drawing shapes / pixels on the screen rendering a bitmap image and playing sounds. (Editor's note: For all budding game developers, do use the new "Arduboy2" library for future dev.) Working with the Arduino IDE Although the Arduino IDE is relatively basic, it does provide the essentials. If you find that you miss some of the bells and whistles of your favorite IDE, you can enable the “Use external editor" option under Preferences > Settings. Enabling this will cause the Arduino IDE fo reload the sketch when it detects file changes [ie when you save from your external editor) and will prevent you from making edits in the Arduino IDE itself. Initialization and the Game Loop Sketches have, at minimum, two very important functions: to be continued next page >> Page 16 of 19 1. setup) — which contains all of your game initialization. This is where you'll want to set any initial values, perhaps show your intro screen and call arduboy.begin() 2. loop) - this is the main game loop for your sketch and is focused on handling input, updating and rendering. As your sketch grows, you may want to refactor it into multiple files and then include them into your main arduboy- game. ino file. For example: #include “enemy.h” Compiling and Uploading c= the check mark on the toolbar or select Sketch >> Verify/Compile and the Arduino IDE will compile your sketch and display all of the warnings and errors in the bottom of the window. B Click the right arrow on the toolbar or select Sketch >> Upload to compile and upload your game. Note that rather large sketches can be a bit finicky to upload. (See the Golchas section below] Debugging Debugging on the Arduboy is quite limited. Generally, the approach is to print text straight to the screen or print to the Serial Monitor by: 1. Setting the baud rate with Serial.begin(9600) 2. Logging messages and values with Serial.printinQ) or print 3. Click the magnifying glass or select Tools>>Serial Monitor to view your output. Gotchas Whilst developing Evade, we came across @ few things that can trip up those new to working with the Arduino IDE and Arduboy: The Arduino IDE doesn’t reload files from dik if they change whilst it has them open. This can cause some issues when working, in a team, as it is common to change branch in git at the command line. This may change the files, so that the version you are looking at in the IDE is now out of sync with what's on the disk. We generally got around this by closing and re-opening the IDE when changing branches, but we could also probably have used the “External Editor” option in the IDE and edited the code in another editor such as Sublime Text or VS Code. There is really limited debugging capability; the IDE isn't able to inspect a running program on the Arduboy which limited us to using Serial.print or temporary text on the screen AS our sketch started to become larger ‘and approach the maximum limit of the device's RAM, we found we couldn't upload new code fo the device without resetting it using the recessed reset button in the bottom. A paperclip or toothpick became part of the process :) Turns out that this seems to be a known issue when uploading code that approaches the memory limits. Game Over Creating Evade was incredibly fun not only because of the game content but because writing in C on the Arduboy forced us to think differently... and that's @ good thing. Most of the team had to quickly learn both C coding and the Arduino environment. The cognitive load for everyone was high, but we need to go beyond our comfort zones if we are to grow as developers. This project was the perfect opportunity to do that. We also found that we could still manage the team like it was any other software project. We set up a Trello board and held standups. We used Github for version control and Slack/Hangouts for communication. In fact, we have a series of blog posts coming for Evade where we plan to share everything from how the project was managed to how the music was made. PLAY EDVADE! If you like what you've read here, keep an eye out for the orginial 5109 post on the game's development Page 17 of 19 AROUBOSBWORKS HORI! 4TH MARCH MEDWAY. KENT if you are in the UK and close to Medway, Kent, @TheArduinoGuy (Mike McRoberts) is running a short Arduboy game dev workshop at Medway Makers on Saturday for beginners. Spend a productive weekend day with newly made friends learning a new skill, making something cool, or helping someone else make something cool and having fun in the process. Everyone is welcome to join! Harduboy: @brzezinskitv @ca5llum @marcy.gram Time for a Coffee break! Post your photos with Arduboy on Instagram and Twitter with #arduboy. We want to feature them in this segment! Thank youF Thank you for reading the Magazine! Hope you enjoyed it as much as we did putting it together. We want to know how to make Volume 3 better than the first, so write in to us to tell us what you think! https://twitter.com/arduboymag joinus@arduboymag.com oC

You might also like