Tell us about yourself!

Complete Your Profile
  • MichaelH539 made the instructable HackerBoxes 0015: Connect Everything7 months ago
    HackerBoxes 0015: Connect Everything

    A little late on this one, but I took jasper_fracture's weather widget and added an LCD for displaying additional info as well as a GPS receiver to get current location. The GPS location is passed to the api to get the current weather instead of having to hard code the city/state.I have attached shots of each status captured by the LCD, as well as a zip file containing the .ino file and libraries needed for the program. This entire project was built with items received in the Hackerboxes (HB0008, HB0010, and HB0015). The only part I added outside of what was received in the Hackerboxes was a 10K potentiometer. Can't wait to get the next box!!

    View Instructable »
  • MichaelH539 made the instructable HackerBoxes 0015: Connect Everything7 months ago
    HackerBoxes 0015: Connect Everything

    A little late on this one, but I took jasper_fracture's weather widget and added an LCD for displaying additional info as well as a GPS receiver to get current location. The GPS location is passed to the api to get the current weather instead of having to hard code the city/state.I have attached shots of each status captured by the LCD, as well as a zip file containing the .ino file and libraries needed for the program. This entire project was built with items received in the Hackerboxes (HB0008, HB0010, and HB0015). The only part I added outside of what was received in the Hackerboxes was a 10K potentiometer.Not sure if the zip file will upload or not, but if it doesn't and you want to look at the code let me know and I'll try and post it somewhere. Can't wait to get the next box!!

    View Instructable »
  • Build a Raspberry Pi-Powered Amazon Echo

    Great instructable, thanks! This will be my next project with my son. For any of you that are HackerBox subscribers (www.hackerboxes.com), this works great on the Orange Pi Lite that came in box #0010. It has an on-board microphone, so no need to purchase a separate USB mic. Just download the latest version of Armbian. One other thing, you need to manually install Java 8 SDK before running the automated_install.sh file. After Java 8 is installed and set as the default, the script will run without error.

    View Instructable »
  • MichaelH539 commented on HackerBoxes's instructable HackerBoxes 0011: HAX0R TREAT1 year ago
    HackerBoxes 0011: HAX0R TREAT

    Just finished the "Terrifying Lego Man" project with my son. We used parts from this box as well as some other modules we got with the Digital Soundscapes HackerBox. Not sure if the videos will post as well, but we used servos to move the arms, added two of the RGB LED's for eyes, and added a speaker for a creepy "mama help me!" sound. The coding took a while to figure out, but I was surprised at how simple the electronics portion was to throw together. The Arduino boards are pretty amazing. Can't wait to see what is in next month's box!Here is the code we used for the Lego Man portion of the project. The Wireless Transmitter is the same as the one shown in the examples. For anyone attempting to use both the RF transmitter and servos in a project, you will nee...

    see more »

    Just finished the "Terrifying Lego Man" project with my son. We used parts from this box as well as some other modules we got with the Digital Soundscapes HackerBox. Not sure if the videos will post as well, but we used servos to move the arms, added two of the RGB LED's for eyes, and added a speaker for a creepy "mama help me!" sound. The coding took a while to figure out, but I was surprised at how simple the electronics portion was to throw together. The Arduino boards are pretty amazing. Can't wait to see what is in next month's box!Here is the code we used for the Lego Man portion of the project. The Wireless Transmitter is the same as the one shown in the examples. For anyone attempting to use both the RF transmitter and servos in a project, you will need to use the ServoTimer2 library instead of the regular Servo library. Otherwise, the program won't compile and you will get conflicts. Took us a few days to get all that worked out.<-- Begin Code -->#include <PololuLedStrip.h>#include <ServoTimer2.h>#include <SPI.h>#include <SdFat.h>#include <SdFatUtil.h>#include <SFEMP3Shield.h>#include <VirtualWire.h>SdFat sd;SFEMP3Shield MP3player; const uint8_t volume = 0;const uint16_t monoMode = 3;PololuLedStrip<5> ledStrip;ServoTimer2 leftservo;ServoTimer2 rightservo;#define LED_COUNT 2rgb_color colors[LED_COUNT];int LEDpin = 13;int RFrxPin = 12;uint8_t buf[VW_MAX_MESSAGE_LEN];uint8_t buflen; void setup() { pinMode(5,OUTPUT); pinMode(LEDpin,OUTPUT); digitalWrite(LEDpin,LOW); vw_set_rx_pin(RFrxPin); vw_setup(4000); vw_rx_start(); rgb_color color; color.red = 0; color.green = 0; color.blue = 0; for(uint16_t i = 0; i < LED_COUNT; i++) { colors[i] = color; } ledStrip.write(colors, LED_COUNT); initSD(); initMP3Player();}void loop() { buflen = VW_MAX_MESSAGE_LEN; if (vw_get_message(buf, &buflen)) { if(buf[0]=='A') { digitalWrite(LEDpin,HIGH); TerrifyPeople(); digitalWrite(LEDpin,LOW); } }}void eyeson() { rgb_color color; color.red = 255; color.green = 0; color.blue = 0; for(uint16_t i = 0; i < LED_COUNT; i++) { colors[i] = color; } ledStrip.write(colors, LED_COUNT);}void eyesoff(){ rgb_color color; color.red = 0; color.green = 0; color.blue = 0; for(uint16_t i = 0; i < LED_COUNT; i++) { colors[i] = color; } ledStrip.write(colors, LED_COUNT);}void armsdown(){ leftservo.attach(4); rightservo.attach(3); leftservo.write(map(0, 0, 179, MAX_PULSE_WIDTH, MIN_PULSE_WIDTH)); delay(500); rightservo.write(map(170, 0, 179, MAX_PULSE_WIDTH, MIN_PULSE_WIDTH)); delay(500); leftservo.detach(); rightservo.detach();}void armsup(){ leftservo.attach(4); rightservo.attach(3); leftservo.write(map(170, 0, 179, MAX_PULSE_WIDTH, MIN_PULSE_WIDTH)); delay(500); rightservo.write(map(0, 0, 179, MAX_PULSE_WIDTH, MIN_PULSE_WIDTH)); delay(500); leftservo.detach(); rightservo.detach();}void initSD(){ if(!sd.begin(SD_SEL, SPI_HALF_SPEED)) sd.initErrorHalt(); if(!sd.chdir("/")) sd.errorHalt("sd.chdir");}void initMP3Player(){ MP3player.begin(); MP3player.setVolume(volume, volume); MP3player.setMonoMode(monoMode);}void endMP3Player(){ MP3player.end(); }void TerrifyPeople(){ digitalWrite(LEDpin,HIGH); vw_rx_stop(); delay(20); initMP3Player(); delay(20); eyeson(); delay(500); armsup(); armsdown(); delay(500); MP3player.playMP3("help.wav"); delay(2500); endMP3Player(); delay(20); armsup(); armsdown(); armsup(); armsdown(); delay(500); eyesoff(); delay(20); vw_rx_start(); delay(2000); digitalWrite(LEDpin,LOW);}

    View Instructable »
  • MichaelH539 commented on HackerBoxes's instructable HackerBoxes 0010: Phython Pi1 year ago
    HackerBoxes 0010: Phython Pi

    @munkyutk... There was a new RetrOrangePi 2.5 image released around 26 September that is supposed to fix the WiFi issues that everyone has been experiencing. There was also a 2.5.2 image out there when I went to download the new 2.5 version, but when installed I didn't see a difference between the two. If you are still trying to use the 2.0 version, I would suggest that you skip that and download the new version. If that doesn't work, you may need to get a new micro SD card. The one I got with the box burned successfully once, but then it became a read only drive and I can't do anything with it now.The RetrOrangePi images aren't really working the way I had hoped, so I am trying to do a fresh install of everything using the Armbian 5.20 image. I compiled and built EmulationStation ...

    see more »

    @munkyutk... There was a new RetrOrangePi 2.5 image released around 26 September that is supposed to fix the WiFi issues that everyone has been experiencing. There was also a 2.5.2 image out there when I went to download the new 2.5 version, but when installed I didn't see a difference between the two. If you are still trying to use the 2.0 version, I would suggest that you skip that and download the new version. If that doesn't work, you may need to get a new micro SD card. The one I got with the box burned successfully once, but then it became a read only drive and I can't do anything with it now.The RetrOrangePi images aren't really working the way I had hoped, so I am trying to do a fresh install of everything using the Armbian 5.20 image. I compiled and built EmulationStation successfully last night, so now I just have to get the RetroArch backend installed. Haven't had much success with that at this point. I love the EmulationStation frontend though. Much cleaner than what I have found with the Kodi addons.

    View Instructable »
  • MichaelH539 commented on HackerBoxes's instructable HackerBoxes 0010: Phython Pi1 year ago
    HackerBoxes 0010: Phython Pi

    @mainegeek - Thanks for the tip! It was in fact a bum micro SD card that was causing the issues. I used the 8GB SD card from the 0007 Hackerbox, and everything worked as expected. I did need to perform your fix on the new card before the WiFi would work, but other than that everything is working great!Has anyone else invested in heat sinks for the processor and memory chips yet? Is that even needed? I was thinking this could be a pretty nice addition to the game room, but I'm worried how these things handle heat issues without heat sinks or fans. Are they robust enough to handle running the emulators for an extended period without burning out?

    View Instructable »
  • MichaelH539 commented on HackerBoxes's instructable HackerBoxes 0010: Phython Pi1 year ago
    HackerBoxes 0010: Phython Pi

    Update:Ok, so still not able to start the wifi by performing the steps above, but I was able to manually start the wifi module by running the following commands:sudo modprobe 8189fssudo ifconfig wlan0 uponce I ran those, the wifi popped in and I was able to see the networks. Still trying to figure out how to get this to stick on reboot though...

    Did you need to do anything special to get the changes to stick after reboot? When I changed the file and rebooted, the change I made is gone and the wifi will not load. I tried going into Desktop from RetrOrange Pi menu, as well as logging in directly as root from the initial log on, but no luck. Its almost like persistence hasn't be enabled on the drive.

    View Instructable »
  • MichaelH539 commented on HackerBoxes's instructable HackerBoxes 0008: Clockwork1 year ago
    HackerBoxes 0008: Clockwork

    @josh45631... Usually when I run into an error like that, it is because I deleted a "{" or "}" somewhere or forgot the semi-colon. Also, make sure you have both the Streaming and Time libraries installed before you create the program. I have to close and re-open when a new library is installed for some reason. Here is what I had for the code, and it compiled without a problem. Double check the pin definitions though, I don't have it wired up anymore, and I might have entered them wrong. Here it is. Let me know how it goes... good luck!<---Begin Code--->#include <DS1302RTC.h>#include <Streaming.h> //http://arduiniana.org/libraries/streaming/#include <Time.h> //http://playground.arduino.cc/Code/Time// Set pins: CE, IO,CLKDS1302RTC RTC(9...

    see more »

    @josh45631... Usually when I run into an error like that, it is because I deleted a "{" or "}" somewhere or forgot the semi-colon. Also, make sure you have both the Streaming and Time libraries installed before you create the program. I have to close and re-open when a new library is installed for some reason. Here is what I had for the code, and it compiled without a problem. Double check the pin definitions though, I don't have it wired up anymore, and I might have entered them wrong. Here it is. Let me know how it goes... good luck!<---Begin Code--->#include <DS1302RTC.h>#include <Streaming.h> //http://arduiniana.org/libraries/streaming/#include <Time.h> //http://playground.arduino.cc/Code/Time// Set pins: CE, IO,CLKDS1302RTC RTC(9, 8, 7);// Optional connection for RTC module#define DS1302_GND_PIN 6#define DS1302_VCC_PIN 5void setup(void){ Serial.begin(115200); // Activate RTC module digitalWrite(DS1302_GND_PIN, LOW); pinMode(DS1302_GND_PIN, OUTPUT); digitalWrite(DS1302_VCC_PIN, HIGH); pinMode(DS1302_VCC_PIN, OUTPUT); Serial << F("RTC module activated"); Serial << endl; delay(500); if (RTC.haltRTC()) { Serial << F("The DS1302 is stopped. Please set time"); Serial << F("to initialize the time and begin running."); Serial << endl; } if (!RTC.writeEN()) { Serial << F("The DS1302 is write protected. This normal."); Serial << endl; } delay(5000); //setSyncProvider() causes the Time library to synchronize with the //external RTC by calling RTC.get() every five minutes by default. setSyncProvider(RTC.get); Serial << F("RTC Sync"); if (timeStatus() == timeSet) Serial << F(" Ok!"); else Serial << F(" FAIL!"); Serial << endl;}void loop(void){ static time_t tLast; time_t t; tmElements_t tm; //check for input to set the RTC, minimum length is 12, i.e. yy,m,d,h,m,s if (Serial.available() >= 12) { //note that the tmElements_t Year member is an offset from 1970, //but the RTC wants the last two digits of the calendar year. //use the convenience macros from Time.h to do the conversions. int y = Serial.parseInt(); if (y >= 100 && y < 1000) Serial << F("Error: Year must be two digits or four digits!") << endl; else { if (y >= 1000) tm.Year = CalendarYrToTm(y); else //(y < 100) tm.Year = y2kYearToTm(y); tm.Month = Serial.parseInt(); tm.Day = Serial.parseInt(); tm.Hour = Serial.parseInt(); tm.Minute = Serial.parseInt(); tm.Second = Serial.parseInt(); t = makeTime(tm); //use the time_t value to ensure correct weekday is set if(RTC.set(t) == 0) { // Success setTime(t); Serial << F("RTC set to: "); printDateTime(t); Serial << endl; } else Serial << F("RTC set failed!") << endl; //dump any extraneous input while (Serial.available() > 0) Serial.read(); } } t = now(); if (t != tLast) { tLast = t; printDateTime(t); Serial << endl; }}//print date and time to Serialvoid printDateTime(time_t t){ printDate(t); Serial << ' '; printTime(t);}//print time to Serialvoid printTime(time_t t){ printI00(hour(t), ':'); printI00(minute(t), ':'); printI00(second(t), ' ');}//print date to Serialvoid printDate(time_t t){ printI00(day(t), 0); Serial << monthShortStr(month(t)) << _DEC(year(t));}//Print an integer in "00" format (with leading zero),//followed by a delimiter character to Serial.//Input value assumed to be between 0 and 99.void printI00(int val, char delim){ if (val < 10) Serial << '0'; Serial << _DEC(val); if (delim > 0) Serial << delim; return;}

    View Instructable »
  • MichaelH539 commented on HackerBoxes's instructable HackerBoxes 0008: Clockwork1 year ago
    HackerBoxes 0008: Clockwork

    I was able to Frankenstein a GPS Clock display using the "Receiving GPS Time" step and a portion of the "RTC to LCD" program with a few minor tweaks. I wasn't, however, able to use the time offset in the TimeGPS program to output the current local time to the LCD. I had to manually add the offset into the "display.printTime" line. Code has been pasted below. Is there any way to make this code less clunky, and use the offset time from the TimeGPS program? It seems like a lot of the code was already there to print to an LCD, but couldn't get it to work with the seven segment LCD display chip that came with the box.// Begin TimeGPS_Display program code. Note CLK and DIO pins from TM1637 are connected to Arduino pins 4 and 3 respectively.#include <Time...

    see more »

    I was able to Frankenstein a GPS Clock display using the "Receiving GPS Time" step and a portion of the "RTC to LCD" program with a few minor tweaks. I wasn't, however, able to use the time offset in the TimeGPS program to output the current local time to the LCD. I had to manually add the offset into the "display.printTime" line. Code has been pasted below. Is there any way to make this code less clunky, and use the offset time from the TimeGPS program? It seems like a lot of the code was already there to print to an LCD, but couldn't get it to work with the seven segment LCD display chip that came with the box.// Begin TimeGPS_Display program code. Note CLK and DIO pins from TM1637 are connected to Arduino pins 4 and 3 respectively.#include <TimeLib.h>#include <TinyGPS.h> // http://arduiniana.org/libraries/TinyGPS/#include <SoftwareSerial.h>#include <SevenSegmentTM1637.h>#include <SevenSegmentExtended.h>// TinyGPS and SoftwareSerial libraries are the work of Mikal HartSoftwareSerial SerialGPS = SoftwareSerial(2,3); // receive on pin 10TinyGPS gps; // Offset hours from gps time (UTC)const int offset = 3; // Local Time// LCD pins: (clock, data)const byte PIN_CLK = 4;const byte PIN_DIO = 3;SevenSegmentExtended display(PIN_CLK, PIN_DIO);time_t prevDisplay = 0; // when the digital clock was displayedvoid setup(){ Serial.begin(9600); while (!Serial) ; // Needed for Leonardo only SerialGPS.begin(9600); Serial.println("Waiting for GPS time ... "); display.begin(); display.setBacklight(100);}void loop(){ while (SerialGPS.available()) { if (gps.encode(SerialGPS.read())) { // process gps messages // when TinyGPS reports new data... unsigned long age; int Year; byte Month, Day, Hour, Minute, Second; gps.crack_datetime(&Year, &Month, &Day, &Hour, &Minute, &Second, NULL, &age); if (age < 500) { // set the Time to the latest GPS reading setTime(Hour, Minute, Second, Day, Month, Year); adjustTime(offset * SECS_PER_HOUR); // show the current UTC time on the display plus offset for local time display.printTime(Hour +3, Minute, true); } } } if (timeStatus()!= timeNotSet) { if (now() != prevDisplay) { //update the display only if the time has changed prevDisplay = now(); digitalClockDisplay(); } }}void digitalClockDisplay(){ // digital clock display of the time Serial.print(hour()); printDigits(minute()); printDigits(second()); Serial.print(" "); Serial.print(day()); Serial.print(" "); Serial.print(month()); Serial.print(" "); Serial.print(year()); Serial.println(); }void printDigits(int digits) { // utility function for digital clock display: prints preceding colon and leading 0 Serial.print(":"); if(digits < 10) Serial.print('0'); Serial.print(digits);}// End TimeGPS_Display program code

    View Instructable »