Category Archives: Academic Electronics

NMD 200 Final Project

This was the project I have been waiting for all semester. I had no idea that I was going to be able to accomplish as much as I have in such a short time. What I did know is that it was possible, and I have found that to be one of the greatest drives towards any of my creations.

When I started this semester, I was extremely ambitious, and had no idea. As I learned more, I became aware of the things that I did not know, and learned that what I wanted to really do, was not yet possible. I stepped down from a drone concept and considered creating a full on electric powered scooter. I eventually considered this to be just as ambitious for the the time and knowledge I had.

I finally decided on the car concept, and really wanted to create something that I would want to keep for a long time. Having worked on the previous project in a team setting, I gained some experience with developing cars, but felt held back in the interest of letting some failure be just as much a lesson for the rest of the group. I found the challenge of overcoming those barriers in the end gratifying.

What I wanted to seek out was a proof of concept of a prototype wireless remote control. While many other connection methodologies were suggested, I chose the route of bluetooth radio frequencies. I understand that the transmittal range was that of 30 feet, but I really couldn’t justify my creation being that far away in the first place. I have had some experience with bluetooth in the past, and knew how much of a <beeeep> it is to setup. I also knew that my plan was ambitious as it was, and began work on the project as soon as the proposal was assigned.

The most important component was control. I could not justify designing the car until I knew how I was going to control it. There is no point, and would have required me to redesign the car as the program and hardware changed.

I developed the circuitry as I developed the code for the Arduino, as well as develop the android program in Processing. I have found that developing the code while developing the hardware has been extremely beneficial. I liken it to playing multiple instruments at the same time, and by weaving the threads of code between the environments, I can make the entire system sing together. I could not prototype this type of setup in 123d circuits. The program just doesn’t have the flexibility I need for the hardware I was developing. Fortunately prior training, and education was extremely helpful.

Once I had the program and circuits completed, I soldered the board together. With the past practice, I was able to apply my lessons to a new board. The stakes were much higher as an Arduino Nano, HC-05 bluetooth module,  and an L293d motor driver were all hostage to my hands. I did destroy a motor driver, but I expected it and it had come with nine other sacrificial brothers and sisters. I replaced it and was able to enhance my soldering skills even further. I’m sure that the next board I put together will be beautiful. It is an art I have found, and it requires some serious planning. I look forward to my next project for this part alone.

My board was all put together, programmed and ready to be installed within whatever rig I wanted. I had some basic components already. A servo, motors, AA battery holder, motherboard. All of these worked well together. This is where my experience with Rhino 3D finally paid off. I measured every component, and modeled them out. I took very careful measurements with calipers and recreated each part. With these measurements I was able to shape a body that would be able to hold the components without having to accept weight for creating a chassis. I was able to create a very simple design that could be laser cut. I chose my securing hardware, and modeled every bolt, washer and nut. I put it together on screen, and pre made holes for every mounting, and every bolt hole. I made sure to think of every little thing, and took extreme care in anticipating issues. In an attempt to avoid failure, I did look more into motors and servos and found that there were much better options in the world then what were already in my hands. I opted to spring money towards a beefy motorized gearbox and a servo that could push and pull anything I wanted.

Between the design of the circuits, programs and the chassis, I had already spent a week and a half focusing on this project. Apart from soldering together the circuit board, I had not manufactured anything. I realized that I still had my 3D printer ready to go from the previous project for the printing I never did for it. The most complex part to manufacture was the swing arms for the steering system. This I felt was the perfect candidate for a 3D print as it was small, and due to its complexity, the 3D printer was the better choice of tool. Having let the print run for a time, it produced my parts exactly as I needed them, with only one small exception. Due to the constraints of the material, the hole I made was not big enough to allow the arm to shift up and down on the suspension system I designed. Oh, sigh. I guess I’ll try suspension another time. I intend on printing a second pair of arms, in case the first one breaks during its presentation.

I wanted to make sure that every aspect of the design was solid, and perfect. I wanted to be able to walk in with my material and confidently place it into the equipment and watch it burn. When I finally got to lay photons on wood, I watched as the material was cut precisely to my every path. My hand was cutting the materials. I made my design, I considered it, and the materials. Once I committed the file to reality, I had already made it. The tools were only there to gestalt my will into this world. How can you not watch what was in your mind become physical and not feel some flicker of hubris.

I finally had the parts that would bring my project together. The bones of my device. I had everything else. As I assembled it, and slipped the first bolt through the first holes, I was greeted with a perfect fit. It was at this moment that I found myself nearly shaking with excitement as I began assembling my device. I made sure not to rush, and took my time to ensure that I was putting it together, using my pre designed model on my computer as reference. All my planning and hard work paid off substantially. That little flicker of hubris just became something of a butane torch in a matter of moments. I liken the process of the assembly as like opening a prefabricated kit and assembling it yourself. Within an hour or two ( I can’t remember how long it took), I had the unit fully together, and ready to be tested for the first time. It had ragged connections and faulted a number of times, but it reacted and responded to the program on my phone. I instantly recognized a number of issues that had to be corrected. I anticipated issues. However, my design worked.

I spent more time working out the bugs, and calibrating the coding to the physical setup. I had to reduce the range of the servo so that it wouldn’t flip the wheels inside out. The control interface was reversed (left was right, right was left, forward was back …ect), and there were some cross signals going on. I had discovered that in bluetooth it was much easier to code my data in byte arrays. Since there are only 255 bytes, I had to reserve some of the byte range to be command codes. This allowed me to expand the functionality of my interface allowing me to add in control of headlights.

I worked out the last of the bug and have ended up with a very solid chassis and control interface. It works as designed. Now it was time for the aesthetics. It is in my view that I had to work in these three stages to completion before I could move on to the next stage. Step 1: what do I need to make this thing go? Step 2: What do I need to make to keep this thing together? Step 3: What do I need to do to make this look pretty?

With vehicles, weight is an issue. It has become my belief that your power source should be the heaviest thing on the vehicle. With this design philosophy, I am hoping to keep weight to a minimum, even with my aesthetics. Initially I was going to do a 3D print, but felt that I would be playing a lot of risk against time and potential failure. While the body design meets the complexity requirement for a 3D printer, its size makes it prohibitive. I instead turned back to the laser cut and apply a skill I taught myself a long time ago.

I used to create 3D models of spaceships using a laser printer and cardstock. Through this process, I learned how folding and cutting paper in certain ways allowed me to make complex shapes. However I had used a program called Pepakura to print premanufactured designs. This would be my first time designing, unfolding and creating patterns for a laser cutter. This is a tool I wish I had back then. The most painful and arduous process of creating the models was the delicate process of cutting the patterns out with a xacto blade, tweezers, and steady hands. By creating a pattern, and letting the laser do it for me, I could cut an insane amount of time off of this process and get a perfect rendering instead.

My first attempt did not work out, but I solved the issue in realizing that there were multiple paths that were overlaid on each other. This threw off the laser printer and made it nearly impossible for me to complete my first attempt. After redrawing the patterns in illustrator, my second time was flawless, and lacked any scaling issues I had the first time round as well.

Once again, I was prepared for the final steps. I knew exactly how I wanted to enhance the aesthetics by using self designed decals, and some random reflective yellow/black striped tape. Prior to applying these things, I spray painted the paper with light layers of primer. Overall, I have achieved the level of aesthetics that I had planned on, and it worked out very well. The paper folded body adds no weight to the entire construction, and easily comes on and off in case I have to mess with the electronics.  

This was probably the most fun I have had in creating anything. It is incredible the amount of power that I know I could leverage to attain anything I want. Knowing it is possible is half the battle. Knowing that you don’t know how to do it is the other two thirds. Wait.. that’s bad math. Anyways, I knew I did not know how to design a car. However, I knew how to create 3D models. I knew I could program an arduino, I knew I could program for android, and I have worked with bluetooth before. There was the whole part of not knowing much about creating self propelled rolling things. This consumed a good chunk of research time, and it resulted in my making changes to the design compared to the proposal I submitted.

What made this project go so well for me, was that I had a great deal of experience using many of the tools applied. I learned how to use 3D modeling, and graphical design softwares on my own. I developed a level of comfort with them that does not hinder my creative imagination. I used to think of my talents and skills as individual things. Now as I venture even further into New Media, I discover that they can all be brought to the table at once. I have demonstrated to myself, and to others, that I am capable of handling every aspect of a project well. From initial design and prototyping, to the development and troubleshooting. I can leverage creative skills to hack answers, and use my professional training to keep pushing on.

I never thought I would find myself papercrafting again. It was a fun skill to develop, but had no practical use for it besides making spaceships. Suddenly I found the perfect use for those skills, and it was from that experience that I knew how to create my own design and patterns. The laser cutter added the next level. What would have taken me the better part of a day, I was able to accomplish in an hour and a half.

I can’t live without this technology ever again. I am absolutely impassioned by what I have accomplished. I look on my creation and feel joy, and smugness. What used to only exist in my head, and in my computer was made real. I was happy to do this project, and find something that brought everything that I have learned into play. I used both laser cutters, my own 3D printer, vinyl cutter, integrated circuits, and microcontrollers. Added to this my experience, I was able to plan out my every step and made sure that I took into account every little detail. This preparation and planning made all the difference in this project. By knowing exactly what I wanted and needed, I could prepare, and be ready. As soon as that phase’s manufacturing was completed, assembly was rapid, and troubleshooting could begin immediately.

There is nothing like a plan that comes out as planned. Not many do. This was the rare case in which everything came out exactly as I planned, and ahead of schedule. I can’t tell you how disgustingly pleased I am.

Final Project – Progress Snapshot

As soon as this was assigned, I began work on designing and developing my project. I have decided that for my capstone, I will be developing a drone. As steps towards that goal, this project hosts a number of skills required to master that final task.

NMD 200 Final Proposal (PDF)

The above link is my proposal for this project. However, my current direction has deviated to my proposed implementations. One of my greatest concerns was the mechanics and has been under serious consideration and research since inception. Here are a few sketches I did during this phase of planning:

 

Having worked with Bluetooth technology in the past, I know how much of a pain it would be to get that working. My first order of business was to develop the circuitry and programs by which I could remotely control the car. After all, why make a remote controlled car if the remote doesn’t work? I had to promise control, or the entire project would fail. Below are images of the prototyping and development phase of this portion of the project.

screen-shot-2016-11-29-at-10-09-29-pm

Having finalized the soldering and programing for both the Arduino and my phone, I have moved on to the design and manufacturing of the car itself. Below is the current design thus far, but modifications are being done rapidly. It is also my intention that for the final phase of this project, I will be 3D printing a cover to enhance the aesthetics.

Project 3 – Organisms

In this NMD 200 project, we were placed into teams and given the instructions to create something that emulates an organism. The definition of an organism is something that reacts to the environment in some manner.

In my group of three others, we were going to create a robot that would boldly go forward, until it met either a never ending expanse (drop off) or meets an obstacle. At which point it would back up, and turn. We met with some challenges along the way, but in the end, we created a product that was capable of motion, and reaction.

My contributions for this project included: 3d Modeling, 3D printing, coding, laser cutting, and troubleshooting.

The final product can be seen here as a 3D scan. From the previous link, you can rotate and view the contraption from all sides. Simply click the 3D view below the image to do this. I apologize for the poor quality of the scan. This link will show you a 3D scan of what it looks like below the top

The following stream of images captures portions of the project.

 

The beginning sketches of the design.

Project 3 Proposal (pdf)

I created a holder for our ultrasonic sensor. 3D molded in Rhino3D. Printed on M3D printer. Assembled using assorted nuts/bolts/washers that I keep for just such things. Unfortunately, the dimensions I used from an online spec sheet was for a different manufacture, so the holes were of the wrong size for mounting. The holder did well despite. Below is a video of the testing of the ultrasonic sensor. When the sensor senses something within its range, the Arduino board sets a white light to flash. You can also see the feedback of the sensor, allowing us to see the range it has measured.

The below images show the full assembly coming together.

Circuit Diagram (Autodesk website)

When the unit was finally fully assembled, we could test the drive system’s reaction to sensory input. This time, the code changes the speed and direction of the motors based on the distances detected by the ultrasonic sensor. The closer an object got, the slower the machine became. Once the object was below a certain threshold, the unit will reverse and begin the turning sequence.

 

We met with a larger issue upon testing. The unit was too heavy, and the motors were unable to overcome inertia. We started out by buying larger motors, but found that even they were barely able to propel the vehicle. That was when we started to use gears and developed our own gearing system to amplify the force of the motor. This worked very well, and proved the power of gears.

 

The remainder of this post is a copy of the code that went into the Arduino. The coding is very simple, and I consider it to be open source. If you are not intersted in coding mumbo jumbo, then you can pass on this part.

//NMD 200 Univeristy of Maine
//Group Memembers: Jason Dignan, Jacob Houghman, Andrea Jean, Sam Woodward
//Square Dancin robotic hot rod
//Code Author: Jason Dignan



////////////////////////////////////////////////////////////////////////////////////////// VARIABLES //////////////////////////////
//////////////////////////////PIN DESIGNATIONS
int backLights = 3; //backuplights
int ledArray[] = {0, 1, 2}; //LED outputs for emoting out
int mLeft[] = {4,5}; //Motor Activation. Index 0 is forward, Index 1 is reverse
int mRight[] = {9,8};
int msLeft = 6; //Motor speed. Analog write controls speed of the motor
int msRight = 10;
int sRangeTrig = 13; //Ultrasonic Range Sensor Trigger pin
int sRangeEcho = 12; //Ultrasonic Range Sensor Echo pin
int sLaserPower = 7;
int sLaserOn = 11;
int Speaker = A0;

//////////////////////////////VARIABLES
int currtime = 0; //Stores the current time from millis()
int inches = 0; //Stores distances of things found via sonar
int ledLast =0;
int ledInterval = 200;
int ledCurrent = 0;


//////////////////////////////BOOLEAN STATES

bool Backup = false; //Indicates if the thing is backing up
bool Crazy = false; //Indicates if the thing is going crazy
bool Dance = false; //Indicates if the things is dancing
bool Debug = false; //If true, will activate serial and spit out data


////////////////////////////////////////////////////////////////////////////////////////// SETUP //////////////////////////////
void setup() 
{
 if(Debug)
 Serial.begin(9600); 
 
 for(int i = 0; i < 3; i++) //Set LED pins to output
 {
 pinMode(ledArray[i], OUTPUT);
 if(i<2)
 {
 pinMode(mLeft[i], OUTPUT);
 pinMode(mRight[i], OUTPUT);
 }
 }
 pinMode(msLeft, OUTPUT);
 pinMode(msRight, OUTPUT);
 pinMode(sLaserPower, OUTPUT);
 pinMode(sLaserOn, OUTPUT);
 pinMode(backLights, OUTPUT);
 pinMode(sRangeTrig, OUTPUT);
 pinMode(sRangeEcho, INPUT); //Set the range sensor to input (this is changed later) ((My Range sensor is different then the one used here, will edit final code to reflect this))
 pinMode(Speaker, OUTPUT);
}

////////////////////////////////////////////////////////////////////////////////////////// Loop //////////////////////////////
void loop() 
{
 //lazer(true);
 currtime = currtime + 1; //Finds current Time
 inches = ranger(); //Finds current distance in inches
 motorvator(); //Engages motors.
 if(Backup)
 {
 backupFunc();
 crazyFunc();
 }
 else
 goingForward();

 
 if(Debug)
 {
 Serial.print("In. ");
 Serial.println(inches);
 Serial.print("Ti. ");
 Serial.println(currtime);

 } 
}

////////////////////////////////////////////////////////////////////////////////////////// Motor Control //////////////////////////////
//The motorvator is general purpose transmission. It scales the motor speeds and directions based on distances found
//by the range sensor.
void motorvator()
{
 float motorspeed = map(inches, 2, 50, -100, 255); //Scales the motor's speed with the distance system
 if(Debug) //Debugging output
 {
 Serial.print("MoSp ");
 Serial.println(motorspeed);
 }
 if(motorspeed < 0) //If the motor's speed is less then zero, then it switches which pins are active
 { // Using analog write, we can engage the motors to a certain speed
 Backup= true; //If the unit is backing up, then we set this to true. Will influence other subroutines. 
 analogWrite(msLeft, abs(motorspeed)); //Using abs() as the motor speed can't be negative
 analogWrite(msRight, abs(motorspeed)/2);
 digitalWrite(mLeft[1], HIGH); //This part is what activates and deactivates the enable pins on the motor control chip
 digitalWrite(mRight[1], HIGH);
 digitalWrite(mLeft[0], LOW);
 digitalWrite(mRight[0], LOW);
 }
 else //Similar as to above, but in this case it is if the motor's speed is going forward. 
 {
 Backup= false;
 analogWrite(msLeft, motorspeed);
 analogWrite(msRight, motorspeed);
 digitalWrite(mLeft[0], HIGH);
 digitalWrite(mRight[0], HIGH);
 digitalWrite(mLeft[1], LOW);
 digitalWrite(mRight[1], LOW);
 
 }
}


////////////////////////////////////////////////////////////////////////////////////////// Range Finder Function//////////////////////////////
//The ranger() is used to return, in inches, the distances of objects it detects. 
int ranger()
{
 
 digitalWrite(sRangeTrig, LOW);
 delayMicroseconds(2);
 digitalWrite(sRangeTrig, HIGH);
 delayMicroseconds(10);
 digitalWrite(sRangeTrig, LOW);
 pinMode(sRangeEcho, INPUT);
 return pulseIn(sRangeEcho, HIGH) /74/2; //Converts range finder data to inches
}
 

////////////////////////////////////////////////////////////////////////////////////////// Backup Function //////////////////////////////
void backupFunc()
{
 if(currtime %20 == 0)
 {
 digitalWrite(backLights, HIGH);
 if(currtime %2 == 0)
 tone(Speaker, 700, 4);
 }
 
 
 else
 {
 digitalWrite(backLights, LOW);
 //noTone(Speaker);
 }

}

////////////////////////////////////////////////////////////////////////////////////////// FORWARD Function //////////////////////////////
void goingForward()
{
 if((currtime - ledLast) > ledInterval)
 {
 ledLast = currtime;
 digitalWrite(ledArray[ledCurrent], HIGH);
 for(int i = 0; i < 3; i++)
 {
 if(i != ledCurrent)
 digitalWrite(ledArray[i], LOW);
 }
 if(ledCurrent > 3)
 ledCurrent = 0;
 else
 ledCurrent++;
 }
 
}

////////////////////////////////////////////////////////////////////////////////////////// Crazy Function //////////////////////////////
void crazyFunc()
{

 if(currtime % 1 == 0)
 {
 digitalWrite(ledArray[0], HIGH);
 digitalWrite(ledArray[1], LOW);
 }

 if(currtime % 2 == 0)
 {
 digitalWrite(ledArray[1], HIGH);
 digitalWrite(ledArray[2], LOW);
 }
 if(currtime % 3 == 0)
 {

 digitalWrite(ledArray[0], LOW);
 digitalWrite(ledArray[2], HIGH);
 }
 
}

////////////////////////////////////////////////////////////////////////////////////////// LazerControl //////////////////////////////
void lazer( bool in)
{
 if(in)
 {
 digitalWrite(sLaserOn, HIGH);
 digitalWrite(sLaserPower, HIGH);
 }
 else
 {
 digitalWrite(sLaserOn, LOW);
 digitalWrite(sLaserPower, LOW);
 }
}

Project 2

 

My zealousness for this project can probably be described as an overstatement. I really wanted to succeed and create something really awesome at the same time. My usual process of shoot high, and get something better than average probably was a bit off this time around. It’s okay, I can accept failure, but in the end I felt I had some success. I learned a lot from this, and from that, I’ll be able to do better next time.

So just went wrong?

As you can imagine, my first project’s goal was pretty high. I wanted to have some sort of stabilizer type subsystem for a drone. With my research and trials, I discovered that this scope was far too advanced for my level of knowledge and experience. So I redid the project.

Version two of this project took the form of a formation light controller. Much easier to deal with, but I still had some high goals. I wanted to use two 555 timers in tandem to create a very specific effect. The first 555 would pulse, and activate a light. The trigger pin of the 555 was also connected to a transistor. This would activate a secondary light while the trigger pin was low. This created an alternating light effect. The trigger pin was connected in addition to pin eight of the second 555. When the first 555 was high, the second 555 would activate at a higher pulse rate. This triggered it’s on set of lights.

The final effect was to have the first 555 blink red LEDs and green LEDs alternately, while the second 555 would blink a pair of white LED’s twice per cycle.

Learning how to do this was the most difficult part, but it worked once I completed it. I ordered additional resistors and capacitors of multiple values so that I could tune the circuit to my needs.

The greatest failure that I encountered with the circuit was when I tried to transition the design onto a permanent soldered setup. This was my first time using a perfboard to assemble, so my approach was horrible to say the least. I knew it was not coming out well, and I tried very hard to make it work correctly.

In the end, I was unable to make it work again. This was probably the part that hurt the worst. When I arrived to the conclusion that I failed, and probably damaged some of the components, I took my defeat and went to bed.

The laser cutting portion of this was a better success. While the option of having a box was okay, I was not really enthused by the simplicity. Leave it to me to make it even more complex than I should.

Thankfully, I didn’t have to experiment too much with this part. Having paid close attention to the lessons on how to operate the laser cutter, I found little difficulty. What added to the complexity was that I wanted to take one of my 3D models and convert it to something that could be cut and assembled. I found 123D make and went to town. There was a bit of a learning curve, but once I became familiar with the program, I spent more time adjusting the model and pattern to better fit my needs. There were a number settings, and in the end, I felt I could have done a better job myself by designing the shapes myself. What attracted me to the program was the potential time savings benefit I would gain.

So, Lessons Learned:

  • Circuit Design
    • Really consider the research, and understand your limits. I discovered this in my initial project proposal. I saw a video of it being done on youtube. With the belief that it is possible, I set forward to make it reality. However, technical skill and knowledge are preferable before jumping to the arena and fighting the bull.
    • Soldering is something I need to practice more to get better at, like anything else. I definitely mangled my design, and it was very sad. I half expected this result, as it is my due. Perhaps that was the voice in the back of the head giving me warning bells. Perhaps I should listen to those bells rather than shoving them full of cotton.
  • Laser Cutting
    • Cool doesn’t always equal success.
    • I discovered some limits to the laser cutter in that there were some very sharp points in the design. When the laser cut through, it ended up burning some of those points off, resulting in nubs. That wasn’t the desire, even if it didn’t affect the assembly at all.
    • More pre planning would have been required to integrate the circuit. The suggestion of creating a base with a stand made much more sense, and would have done well to hide certain elements that would not be useful being seen.
    • Automated programs for developing 2D renderings from 3D models are useful, but not entirely dependable. It creates shapes that make sense in digital land, but when made real, are flimsy and creates a fail point. As a result, my design is fragile and requires care when handling and transporting.

While I would consider my project a failure within the scope of the given assignment, I learned a great deal through the process. With this in respect, I found success through what I have completed. Each part had success, the failure lay in myself, and inexperienced in electronics. Something I intend on correcting in the coming weeks, months, and year. I certainly do not feel intimidated, or put off due to these events. With these lessons acquired, I’ll be able to move forward and better guide myself to success, as well as know what questions to ask.

Space docking simulator

The below video shows the planning and construction phases of my solo final project in NMD 102. For my project I combined Arduino and Unity to create a realistic control panel for a space ship. My constraints that all input and all data output had to go to the console.

In unity, I had to create a zero gravity environment with newtonian physics, as well as create a goal for the user.

Programing in the unity and arduino environments done by me.  All 3D models are my design, as is the design of the control console.

 

Continue reading Space docking simulator

Generative Art Piece

For NMD 102 we had to create a generative art piece in processing. For the generative part of this project, an arduino interface was used. Multiple sensors were used interact with the program.

 

This video shows how the arduino’s sensors influenced the happenings on the screen

 

This video shows only the processing output from the program.

http://https://www.youtube.com/watch?v=D4XqeYaHy5k