Netduino home hardware projects downloads community

Jump to content


The Netduino forums have been replaced by new forums at community.wildernesslabs.co. This site has been preserved for archival purposes only and the ability to make new accounts or posts has been turned off.

demonGeek's Content

There have been 42 items by demonGeek (Search limited from 17-June 23)


By content type

See this member's


Sort by                Order  

#10962 SPI + InvalidOperationException

Posted by demonGeek on 16 March 2011 - 12:50 AM in Netduino Plus 2 (and Netduino Plus 1)

**bump** Anyone have any ideas? I'm completely stuck on this one - I don't know if it's the code, the connections or the device itself. Any thoughts would be appreciated.



#11122 Threading Problems After Deploy

Posted by demonGeek on 19 March 2011 - 04:53 PM in General Discussion

Have you thought about using a queue and a timer?

Have a class which holds the data and the timer. Provide an add method which adds data to the queue and starts the timer. The timer event takes data out of the queue and writes the data. If the queue is not empty it restarts the 80ms timer.

Regards,
Mark

Thanks Mark, that would certainly work.

I've also been wondering about some kind of thread blocking mechanism.

The Sparkfun serial backpack has an on-board buffer and the timing issues seem to be centred around marshalling the data to that buffer.

I'll have to play with it some more.

- Adam



#11451 Out of memory issues

Posted by demonGeek on 30 March 2011 - 05:12 AM in General Discussion

IMUSerial = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
IMUSerial.DataReceived += new SerialDataReceivedEventHandler(IMUSerial_DataReceived);
IMUSerial.Open();

//write IMU code
Debug.Print("Serial is " + (IMUSerial.IsOpen? "open" : "not opened"));
byte[] pip = System.Text.Encoding.UTF8.GetBytes("r");

Debug.GC(true);
while (true)
{
	IMUSerial.Write(pip, 0, 1);
	Thread.Sleep(100);
	
}

static void IMUSerial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
	byte[] buffer = new byte[10];
	IMUSerial.Read(buffer, 0, 10);
	String message = new String(System.Text.Encoding.UTF8.GetChars(buffer));
	Debug.Print(message);
}


What happens if you move the buffer array up to the class level rather than creating a new instance each time the event fires?



#11457 Out of memory issues

Posted by demonGeek on 30 March 2011 - 06:41 AM in General Discussion

I get more or less the same result, it might take a bit longer (it is hard to say) but still runs out of memory at aprox the same pace.



I am pretty sure I am getting much more data than what I am consuming -through serialport.read-. I assumed it would be stored in the serial chip's memory and when full it would just drop new data. I'd make sense that, if an internal buffer expands with arriving data it would end up too big... I'll give that a shot and report back


Try hooking the ErrorReceived event on the SerialPort and see if that provides more information. If you are overflowing the internal buffer it will generate an exception with the event type of RXOver.



#11103 Threading Problems After Deploy

Posted by demonGeek on 19 March 2011 - 04:27 AM in General Discussion

I believe the problem you are seeing is because the code doesn't actually do what you want it to do. You want an 80 ms delay between writes, however in this code the writes can all end up stacked on top of each other. If this doesn't make sense, consider this example:


You're absolutely right, that's exactly what's happening.

Thanks for the help.

- Adam



#11146 Problems with creating an ohm meter circuit

Posted by demonGeek on 20 March 2011 - 07:44 PM in General Discussion

If you want to use floating point division, at least one operand as to be a float.


Tecchie is absolutely correct. I should have mentioned that I modified your original code to explicitly type the variables.

Personally I dislike using var unless there's no other choice. I prefer to make my code as explicit as possible because it leaves less room for mistakes.

As far as the AREF is concerned, I don't know how the Fez Panda works but the Netduino has an internal AREF (on by default) and an external AREF pin. It seemed to me that I got better results using the external AREF but I didn't really test that much so it might not be the case. Either way, you need to understand how the Fez Panda's AREF works otherwise the A/D conversion will be off.

- Adam



#11094 Threading Problems After Deploy

Posted by demonGeek on 18 March 2011 - 11:18 PM in General Discussion

I'm playing with some code to drive a Sparkfun Serial LCD and ran into some timing issues which caused a garbled display unless I put an 80ms delay (Thread.Sleep) between each write operation.

This was fine for testing but with the delay on the main thread it slows everything down whenever I write to the LCD. So I thought it might be a good idea to put the write operation on its own thread like this:

private void Write(byte[] data)
{
	new Thread(delegate { this._Write(data); }).Start();
}

private void _Write(byte[] data)
{
	this.port.Write(data, 0, data.Length);
	Thread.Sleep(80);
}

This code works fine as long as the debugger is attached but as soon as I deploy and reset the Netduino, the display ceases to function. The code itself is still operational (no exceptions, as far as I can tell) but the display thread doesn't seem to be doing anything. If I remove the threading and write to the device directly everything is fine again.

Is this expected behaviour? Is there some better way of doing this that I don't know about?

- Adam

[N+ firmware v4.1.1.0 ALPHA7]



#10862 Problems with creating an ohm meter circuit

Posted by demonGeek on 13 March 2011 - 01:31 AM in General Discussion

I believe that 3.3V is the maximum on the analog pins so 5V is going to max out the reading at 1023 all the time and skew the results.

When I tested at 3.3V I was getting much better data but there was still a wide variance so I hooked up an external AREF (connect the 3.3V line to the AREF pin) and switched on the external AREF in the code. I also averaged out the result and found that after a dozen or so samples it stabilized at close to the right value. Here's the code:

// Rev B boards use internal AREF by default: switch to external AREF
OutputPort arefSelect = new OutputPort((Cpu.Pin)56, false);

AnalogInput A0 = new AnalogInput(Pins.GPIO_PIN_A0);

const float vIn = 3.3F;
const float rKnown = 10000;
float rTotal = 0;
int samples = 0;

while (true)
{
	float vRead = ((vIn / 1024) * (float)A0.Read());
	rTotal += (rKnown * ((vIn / vRead) - 1));
	samples++;
	Debug.Print("Resistance: " + System.Math.Round(rTotal / samples));
	Thread.Sleep(1000);
}

[N+ firmware v4.1.1.0 ALPHA7]



#11144 Battery Power Solutions for Motors?

Posted by demonGeek on 20 March 2011 - 07:23 PM in General Discussion

I'm just starting to think about powering my projects from batteries.

I got this 2000mAh Polymer Lithium Ion Battery and this converter so I think I have the Netduino and sensors covered but I'm wondering about devices, such as motors, that require a bit more power.

I know there are a ton of options out there but I wanted to find out what people here are using and what works well.

Thanks in advance.

- Adam



#11242 Battery Power Solutions for Motors?

Posted by demonGeek on 24 March 2011 - 06:25 AM in General Discussion

I use RC grade Lipos/NiMhs.

Check this sorta stuff out: http://www.hobbyking...?idProduct=8935


Thanks Chris.

Looks like a good way to go.



#11444 double.Parse bug

Posted by demonGeek on 30 March 2011 - 12:15 AM in General Discussion

Confirmed. I see the same behaviour in NETMF but not in the full framework. -0.1 to -0.9 are parsed as positive values.



#11436 Garbage collection in the .Net MF

Posted by demonGeek on 29 March 2011 - 04:43 PM in General Discussion

The garbage collector in .NET Micro Framework is a simple mark-and-sweep.


So do you think that it is a good strategy to avoid long-term objects as much as possible in NETMF code?



#11422 Garbage collection in the .Net MF

Posted by demonGeek on 29 March 2011 - 04:55 AM in General Discussion

Interesting video. Given that the Compact Framework only implements one-generation GC, I wouldn't imagine that the Micro Framework is any different. Which leads to an equally interesting observation: In a one-generation GC, every live object on the heap must be considered during each garbage collection. Therefore, the more long-term objects in a NETMF application, the slower the GC cycle. Reducing the number of long-term objects should improve overall GC performance. If correct, that observation will certainly have a bearing on the way I code my NETMF apps. - Adam



#11452 USB Communication Between Two Netduino's?

Posted by demonGeek on 30 March 2011 - 05:17 AM in Netduino 2 (and Netduino 1)

Hi demonGeek,

Certainly possible. Nothing supported today, but if the USB host enabled it...

Chris


Thanks Chris. Certainly something to think about.

I'm looking for a good fast way for two or more Netduino's to communicate without the memory overhead of a network stack and without using the I/O pins if possible. USB might be a good way to go.

- Adam



#11445 USB Communication Between Two Netduino's?

Posted by demonGeek on 30 March 2011 - 01:16 AM in Netduino 2 (and Netduino 1)

With 4.1.2 already offering early USB client support, will USB communication between two Netduino's become a possibility?

Perhaps using a USB Host Shield like this one.

Thanks.

- Adam



#10857 Magnetometers

Posted by demonGeek on 12 March 2011 - 10:41 PM in General Discussion

Anyone here have any experience with magnetometers?

Which one(s) have you used? What interface? How easy is it to work with? How well did the tilt-compensation (if any) work?


I'm not very experienced with them but I did just get one working with my Netduino so I thought I'd share that with you ;-)

I've had a Sure Electronics Dual-axis Magnetic Sensor Module (DC-SS503) sitting around for a while and wanted to experiment with the I2C interface. It turns out to be a really simple interface and I'd recommend it not just because it's simple but also because you can chain a bunch of I2C devices on a bus which avoids using all your Netduino pins driving multiple sensors.

Anyway, like I said, I'm not an expert but I hooked it up and got some data back which changes as I rotate the device in the X or Y axes. What that data means is my next task to figure out.

This is the test code I used to initiate a measurement and read the results:

byte[] buffer = new byte[5];
int bytesWritten = 0;

// Create the I2C device (device address: 0x30, clock rate: 400Khz)
I2CDevice.Configuration i2cConfig = new I2CDevice.Configuration(0x30, 400);
I2CDevice device = new I2CDevice(i2cConfig);

// Send command to take measurements (0x00) followed by (0x01)
I2CDevice.I2CTransaction[] writeTx = new I2CDevice.I2CTransaction[] { I2CDevice.CreateWriteTransaction(new byte[] { 0x00, 0x01 }) };
bytesWritten = device.Execute(writeTx, 1000);

// Pause for (minimum) 5ms as device completes data acquisition
Thread.Sleep(10);

// Read the 5-byte response from the device
I2CDevice.I2CTransaction[] readTx = new I2CDevice.I2CTransaction[] { I2CDevice.CreateReadTransaction(buffer) };
bytesWritten = device.Execute(readTx, 1000);

Debug.Print("Internal Register: " + buffer[0].ToString());
Debug.Print("X-Axis: " + ((buffer[1] * 0x100) + buffer[2]).ToString());
Debug.Print("Y-Axis: " + ((buffer[3] * 0x100) + buffer[4]).ToString());

Make sure you have the 4.1.1 ALPHA 7 firmware.

Hope that helps.



#10834 i2c master to .NET

Posted by demonGeek on 12 March 2011 - 12:40 AM in General Discussion

I have used the i2cmaster.h when i was working with arduino. Now i try to convert it to C# but i dont understand it.
Can some pleas help me convert this code to c#.


Having just figured out I2C myself, I can tell you that you don't have the same (low) level of control over I2C in C# (NETMF). The I2CTransaction wraps the complexities of the protocol and handles the start/stop/acks for you.

Here's some basic test code that I used to read/write a 24LC32A serial EEPROM:

public static void Main()
{
	byte[] buffer = new byte[1];
	int bytesWritten = 0;

	// Create the I2C device (device address: 0x54, clock rate: 50Khz)
	I2CDevice.Configuration i2cConfig = new I2CDevice.Configuration(0x54, 50);
	I2CDevice eeprom = new I2CDevice(i2cConfig);
			
	// Write the letter 'A' (0x41) to address 0x0000 on the eeprom
	I2CDevice.I2CTransaction[] writeTx = new I2CDevice.I2CTransaction[] { CreateWriteTransaction(new byte[] { 0x00, 0x00, 0x41 }, 0, 0) };
	bytesWritten = eeprom.Execute(writeTx, 1000);

	// Read the byte at address 0x0000 on the eeprom
	I2CDevice.I2CTransaction[]  readTx = new I2CDevice.I2CTransaction[] { CreateReadTransaction(buffer, 0x0000, 2) };
	do { bytesWritten = eeprom.Execute(readTx, 1000); } while (bytesWritten == 0);

	Debug.Print(buffer[0].ToString());

	Thread.Sleep(Timeout.Infinite);
}

#region see: http://forums.netduino.com/index.php?/topic/944-i2c-internaladdress-repeated-start-bit-support/

static I2CDevice.I2CWriteTransaction CreateWriteTransaction(byte[] buffer, uint internalAddress, byte internalAddressSize)
{
	I2CDevice.I2CWriteTransaction writeTransaction = I2CDevice.CreateWriteTransaction(buffer);
	Type writeTransactionType = typeof(I2CDevice.I2CWriteTransaction);

	FieldInfo fieldInfo = writeTransactionType.GetField("Custom_InternalAddress", BindingFlags.NonPublic | BindingFlags.Instance);
	fieldInfo.SetValue(writeTransaction, internalAddress);

	fieldInfo = writeTransactionType.GetField("Custom_InternalAddressSize", BindingFlags.NonPublic | BindingFlags.Instance);
	fieldInfo.SetValue(writeTransaction, internalAddressSize);

	return writeTransaction;
}

static I2CDevice.I2CReadTransaction CreateReadTransaction(byte[] buffer, uint internalAddress, byte internalAddressSize)
{
	I2CDevice.I2CReadTransaction readTransaction = I2CDevice.CreateReadTransaction(buffer);
	Type readTransactionType = typeof(I2CDevice.I2CReadTransaction);

	FieldInfo fieldInfo = readTransactionType.GetField("Custom_InternalAddress", BindingFlags.NonPublic | BindingFlags.Instance);
	fieldInfo.SetValue(readTransaction, internalAddress);

	fieldInfo = readTransactionType.GetField("Custom_InternalAddressSize", BindingFlags.NonPublic | BindingFlags.Instance);
	fieldInfo.SetValue(readTransaction, internalAddressSize);

	return readTransaction;
}

#endregion

Make sure you have the 4.1.1 ALPHA 7 firmware.

Hope that helps.




home    hardware    projects    downloads    community    where to buy    contact Copyright © 2016 Wilderness Labs Inc.  |  Legal   |   CC BY-SA
This webpage is licensed under a Creative Commons Attribution-ShareAlike License.