PhotoWham Reviewed

by tom May 11, 2010 10:20

Nobody told me PhotoWham was up for an editor's review on CNet's Download.com, but that happened last week!   Here's an out of context summary:

"It works in the latest versions of Windows, including Windows 7. It's one of the simplest but most efficient digital photo resizers we've tried."

I'm very excited, as that's exactly what I was going for with this product!    Apparently others are excited as well; the number of downloads/week is skyrocketing.

Here's the page: http://download.cnet.com/PhotoWham/3000-12511_4-10603272.html

 

 

Tags:

New Office Space

by tom February 07, 2010 05:59

Manatee Software, LLC has signed a lease for a 700 sf office space at the Atrium at 1780 E. Ridge Rd.    It's an odd L shape, but comes with lots of windows, I think it'll have a great feel when it's done.    Now the hard work though, in the coming weeks, we'll be clearing out what's there, and doing some remodeling.  Stay tuned, I'll post pictures as we progress!

Tags:

Arduino Range Finder

by tom October 07, 2009 09:27

I've been working w/ the LiquidCrystal library (which rocks), and the MaxSonar EZ4 (MB1040).  Same LCD as I used in previous posts.

Only reading one range finder so far, but this is a start. 

The LCD is set up in 4 bit mode - digital pins 12, 11, 5, 4, 3 and 2. 

PWM pin from the EZ4 is in digital 7.

Enough of that, here's the code!

 

#include <LiquidCrystal.h>

 // these constants won't change.  But you can change the size of
 // your LCD using them:
 const int numRows = 2;
 const int numCols = 16;
 
 // initialize the library with the numbers of the interface pins
 LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
 // pin hooked up to PWM from the ez4
 const int pwPin = 7;

 //variables needed to store values
 long pulse, inches, cm;

void setup() {
  
  // set up the LCD's number of rows and columns: 
  lcd.begin(numRows, numCols);
  
  // throw up a shameless banner
  writeLcd("Manatee Software", 0, 0, true);
  writeLcd("www.manasoft.com", 1, 0, false);  
  delay(200); 
}

// Main loop
void loop() { 
   updateDisplay();
   delay(100);
}

// update display
// the main process that loops
void updateDisplay()
{
    pinMode(pwPin, INPUT);

    //Used to read in the pulse that is being sent by the MaxSonar device.
  //Pulse Width representation with a scale factor of 147 uS per Inch.
  pulse = pulseIn(pwPin, HIGH);

  //147uS per inch
  inches = pulse/147;

// put in the label.  doesn't seem to hurt anything to clear here, but it's
// counter-intuitive.  Probably bad practice...
  writeLcd("Inches: ", 0, 0, true);

// set and print the inches from the calculation  
  lcd.setCursor(9, 0);
  lcd.print(inches);
}

// write to the LCD at a defined position
void writeLcd(char data[], int line, int pos, bool clear)
{
  // clear if desired
  if(clear == true)
  {
    lcd.clear();
  }

  lcd.setCursor(pos, line);
  lcd.print(data);
}

Tags:

PC Support and virus removal for businesses

by tom September 14, 2009 08:15

After years of helping many local businesses with PC, server, and network support, I am planning on branching out into this area officially.  

The goal is to support small (5-50 computer) businesses on the east side of Rochester, NY.

Why you should engage us for your business computer support needs:

1. I have done this for more than 30 years.   I have experience in all areas of information technology, including:

  • Desktop Support
  • Network Administration
  • Software Provisioning and Selection
  • Systems Analysis
  • Software Design and Architecture
  • Software Development
  • Database Development
  • Difficult virus removal

2. In the course of my work for major local corporations, I have acquired the skills and experience required to hire and manage the best people.

3. I understand that you need to get/stay up and running in order to run your business.    I will focus on putting systems into place that follow a preventative maintenance mindset.  It's better to avoid problems than fix problems.

4. Quality service, and professional treatment have always been pillars of my business. 

If you're in need of these services, please drop me a note.    I look forward to working with you!

Tom

 

Tags:

PhotoWham 1.6 Coming Soon!

by tom September 09, 2009 10:54

The big new feature is the most requested feature in the history of this product: copying EXIF information from the source image to the target (resized) image.

This feature will only be available in the licensed versions.

V1.6 is in final testing and will be released within the next few days.  Keep an eye on the PhotoWham page!

 

Tags:

Is this a bug or a requirements change?

by tom May 22, 2009 07:40

In my day job, I work as a software architect and scrum master for a large corporation. Today, a group of managers asked me this question. I say what’s the difference?  In Scrum we try to focus on business value.    Let’s say there are two potential changes on the table:

1. A bug the delivery team introduced with this release. An additional character is displaying in a drop down box text value. All users will see the bug.

2. A new feature/requirements change that we learned from the first people to actually use the latest release in production. Making this change will reduce the potential for error and save each user some time.

All of our users work for the company, so 'soft' benefits like avoiding embarrassment caused by #1 don't matter a whole lot. We don’t have time to do both. In this hypothetical scenario, the effort to fix them is identical.

The waterfall organization, focusing on the ‘contract’ between development, PMO, and the customer, would tend to fix #1, as #2 is out of scope.

The Scrum team would ask which item delivers the most business value. Business value can be tough to determine in a large company. When the user group numbers in the thousands, saving each user some time, even if only 5 seconds/day would be a flag to me, though. Even at 1000 users, 5000 seconds/day x 200 work days/year = 278 hours/year in potential savings. While that’s not going to make or break a large company, it’s clearly more value than the 0 seconds/day the bug fix would save users.

One thing I like about Scrum is the fact that it exposes everyone on the delivery team to patterns of thinking that in many large waterfall organizations are only known to senior managers. Scrum is helping our team members behave like business people, which is something sorely needed in a Dilbertian world.

Tags:

What's coming from Manasoft.com

by tom April 08, 2009 10:36

Lately, we've had several requests for new features/updates to applications, which is great! Upcoming releases:

OmniPing 3.0

This is a complete rewrite on the latest technologies. New features will include:
1. A more responsive user interface thanks to some happy background threads to do the pinging.
2. Ability to ping/scan a larger set of addresses (larger than a class c range).
3. More detail in the result, including dns names and, if available, mac addresses.
4. Updated reporting and data analysis.

GPS Dashboard

Numerous enhancements are coming to this application, mostly centered around a richer and more flexible user interface.

PhotoWham

Planning to copy the EXIF information from the source image to the destination image. This is surprisingly challenging, but that's the plan.

The OmniPing work is scheduled to be completed first, hopefully by June. PhotoWham and GPS Dashboard will follow shortly thereafter.

Thanks for your continued interest in these products! If you have any other requests, please don't hesitate to drop us a note.

Tags:

2DOF Flight Simulator Cockpit

by tom March 03, 2009 12:32

I have been working on this moving 'cockpit' for MS Flight Sim.  It's not done, but is starting to become real. 

It's based on the Joyrider, but made out of aluminum as I was looking for a tig welding project.

The original Joyrider design uses a mechanical link between the seat, the frame, and a control stick to move the whole seat.  Then you attach a PC joystick to the seat, and have the joystick control the game.   My plan is to go a little bit fancier and add motors to both axes of the device, so that the PC (FSX) actually tells the seat how to move.   This kind of thing is partly what interested me about Arduino.  A physical computing platform is key to a project like this.

If you're interested in this sort of thing, there are a lot of sites that go into more detail.  Two of my favorites:

http://www.x-simulator.de/forum/
http://buggies.builtforfun.co.uk/Sim/index.html

Early photos attached.  Don't mind the mess.

Tags:

Arduino Digital Compass

by tom January 11, 2009 07:56

See the previous entry for details on hooking up and talking to the LCD.   This adds an HMC6352 heading sensor, and writes heading on the LCD (which was no small task, at least for me). 

Hooking up the compass:
VCC and GND go right to the bus on my breadboard (coming from the Arduino)
SDA -> Analog 4
SCL -> Analog 5

I read a lot about pull up resistors being required, but found someone's sample where that was not done, so tried it just like specified above, and it worked.   We don't need no stinkin' resistors.  

It took me a lot of hacking to get the format of the heading number correctly left zero padded.   I'm sure there's a better way than what I've got here, but this is the best I could do.   I'd kill for a String.format(); 

And the code:

   1:  // -- For the LCD (Though the newer LiquidCrystal library is much easier to use, IMHO)
   2:  #include  <LCD4Bit.h> 
   3:   
   4:  //create object to control an LCD.  
   5:  //number of lines in display=1
   6:  LCD4Bit lcd = LCD4Bit(2); 
   7:   
   8:  // -- For the Compass
   9:  #include <Wire.h>
  10:  int HMC6352Address = 0x42;
  11:   
  12:  // This is calculated in the setup() function
  13:  int slaveAddress;
  14:  int i, headingValue;
  15:   
  16:  void setup() { 
  17:   
  18:    lcd.init();
  19:    lcd.clear();
  20:    writeLcd("Initializing...", 2, 0, true);
  21:   
  22:    // set up the compass 
  23:    slaveAddress = HMC6352Address >> 1;   // This results in 0x21 as the address to pass to TWI
  24:   
  25:    Wire.begin();
  26:    
  27:    writeLcd("Reading...", 2, 0, true); 
  28:    writeLcd("Hdg: ", 1, 0, false);
  29:  }
  30:   
  31:  // Main loop
  32:  void loop() {  
  33:     updateDisplay();
  34:  }
  35:   
  36:  // write to the LCD at a defined position
  37:  void writeLcd(char data[], int line, int pos, bool clear)
  38:  {
  39:    // clear if desired
  40:    if(clear == true)
  41:    {
  42:      lcd.clear();
  43:    }
  44:   
  45:    lcd.cursorTo(line, pos);
  46:    lcd.printIn(data);
  47:    delay(10);
  48:  }
  49:   
  50:  // just keep going wherever the cursor was
  51:  void appendLcd(char data[])
  52:  {
  53:    lcd.printIn(data);
  54:  }
  55:   
  56:  void updateDisplay()
  57:  {
  58:    byte headingData[2];
  59:    
  60:    // ask the compass for a heading
  61:    Wire.beginTransmission(slaveAddress);
  62:    Wire.send("A");              // The "Get Data" command
  63:    Wire.endTransmission();
  64:    delay(10);             
  65:    
  66:    // The HMC6352 needs at least a 70us (microsecond) delay
  67:    // after this command.  Using 10ms just makes it safe
  68:    // Read the 2 heading bytes, MSB first
  69:    // The resulting 16bit word is the compass heading in 10th's of a degree
  70:    // For example: a heading of 1345 would be 134.5 degrees
  71:    
  72:    Wire.requestFrom(slaveAddress, 2);        // Request the 2 byte heading (MSB comes first)
  73:    i = 0;  
  74:    while(Wire.available() && i < 2)
  75:    { 
  76:      headingData[i] = Wire.receive();
  77:      i++;
  78:    }
  79:     
  80:    headingValue =  headingData[0]*256 + headingData[1];  // Put the MSB and LSB together
  81:        
  82:    int firstPart = headingValue / 10;
  83:    int secondPart = headingValue % 10;
  84:    char buffer[4];
  85:    
  86:    // first write to the LCD.  Set the cursor
  87:    lcd.cursorTo(1, 5); 
  88:   
  89:    // brute force zero padding 
  90:    if(headingValue <= 999)
  91:    {
  92:      appendLcd("0"); // pad with a leading zero
  93:    }
  94:    
  95:    if(headingValue <= 99)
  96:    {
  97:      appendLcd("0");
  98:    }
  99:    
 100:    appendLcd(itoa((firstPart), buffer, 10));  // convert the int to a string and write the degrees
 101:    appendLcd(".");    // decimal point
 102:    appendLcd(itoa((secondPart), buffer, 10));  // and the tenths
 103:   
 104:   delay (750);
 105:  }


Arduino_digitalCompass.wmv (12.66 mb)

 

Tags:

Hooking up a parallel LCD to an Arduino

by tom January 08, 2009 12:44

I have a little compass sensor, and what I want out of that is to make a hand held electronic compass, but I needed something to do some displaying.  Found some examples with parallel LCDs, so decided to give that a shot.  This doesn't do much, but it will get you going with this LCD.

LCD: Newhaven NHD-0216K1Z-FSB-FBW-L
Datasheet: http://www.newhavendisplay.com/specs/NHD-0216K1Z-FSB-FBW-L.pdf

Here are all of the connections I made. 

LCD Pins

Assignment

Arduino Pins

Wire Color (That I Used)

1

GND

GND

Black

2

VDD

5V

Red

3

V0

10k Pot  (Contrast)

Blue

4

RS

11

Green

5

RW

GND

Black

6

E

12

Yellow

7

DB0

 

 

8

DB1

 

 

9

DB2

 

 

10

DB3

 

 

11

DB4

7

Green

12

DB5

8

Yellow

13

DB6

9

Green

14

DB7

10

Yellow

15

A

5V (Backlight)

Red

16

K

GND?

Black

Note that one side lead from the pot goes to ground, the other side to 5v, and the middle lead on the pot goes to the blue wire from the table above.  

The excellent tutorial on ladyada.net will get you through the code.  I won't repeat that here. 

http://www.ladyada.net/learn/arduino/lcd.html

A very short video: 

Arduino-LCD.wmv (2.03 mb)

Tags:

Getting Started w/ Arduino

by tom January 01, 2009 02:20

I've been writing business apps for a long time, but always wanted to learn more about how to make electronic devices do my bidding.    I played with PIC chips a few years ago, but that didn't really do much for me.   I subscribe to Make magazine, and after reading some articles about Arduino, started hacking at that, and it's been a blast.  

If you're interested in electronic gadgets and want to learn more about how they work, I can't recommend Arduino highly enough.  

Here's how I got started:

1. Buy the Arduino Starter Pack listed at the top of this page: http://ladyada.net/learn/arduino/

2. Read on down that page, and do all 5 lessons.  

3. Buy the book Making Things Talk: Practical Methods for Connectiing Physical Objects.  
http://www.amazon.com/exec/obidos/ASIN/0596510519

Armed w/ the knowledge from the 5 Adafruit lessons, this book will fill in a lot of blanks and really get you thinking.  

4. Have fun!

 

 

Tags:

Blinky Lights!

by tom December 21, 2008 07:39

OK I'm a noob hack, but I finally got my Arduino to respond to light.

Here's the code, note it's not much changed from the  AnalogInput example.  Actually I'm not sure I ended up changing the sample at all, just used a photoresistor from +5V over to analog 2 along w/ a 1k resistor to ground.    

 

/*
 * AnalogInput
 * by DojoDave <http://www.0j0.org>
 *
 * Turns on and off a light emitting diode(LED) connected to digital 
 * pin 13. The amount of time the LED will be on and off depends on
 * the value obtained by analogRead(). In the easiest case we connect
 * a potentiometer to analog pin 2.
 *
 * http://www.arduino.cc/en/Tutorial/AnalogInput
 */

int potPin = 2;    // select the input pin for the potentiometer
int ledPin = 13;   // select the pin for the LED
int val = 0;       // variable to store the value coming from the sensor

void setup() {
  pinMode(ledPin, OUTPUT);  // declare the ledPin as an OUTPUT
}

void loop() {
  val = analogRead(potPin);    // read the value from the sensor
  digitalWrite(ledPin, HIGH);  // turn the ledPin on
  delay(val);                  // stop the program for some time
  digitalWrite(ledPin, LOW);   // turn the ledPin off
  delay(val);                  // stop the program for some time
}

 

Video's not very good, but you'll get the idea.  

ArduinoBlinky.wmv (5.49 mb)

Tags:

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen | Modified by Mooglegiant