Treehopper C++ API
|
Built-in I/O pins. More...
#include <Pin.h>
Public Member Functions | |
Pin (TreehopperUsb *board, uint8_t pinNumber) | |
Construct a new pin attached to a given board. More... | |
void | mode (PinMode value) |
Set the PinMode of the pin. More... | |
PinMode | mode () |
Get the current PinMode of the pin. More... | |
void | makePushPullOutput () override |
Make the pin a PinMode::PushPullOutput. More... | |
void | makeDigitalInput () override |
Make the pin a PinMode::DigitalInput. More... | |
void | makeAnalogInput () |
Make the pin a PinMode::AnalogInput. More... | |
void | digitalValue (bool val) override |
Set the digital value of the pin. More... | |
bool | digitalValue () override |
Get the digital value of the pin. More... | |
void | toggleOutput () |
Toggle the output value of the pin. More... | |
void | referenceLevel (AdcReferenceLevel value) |
Set the AdcReferenceLevel of the pin. More... | |
AdcReferenceLevel | referenceLevel () |
Get the AdcReferenceLevel of the pin. More... | |
double | analogValue () |
Get the analog value (0-1) of the pin. More... | |
double | analogVoltage () |
Get the voltage of the pin. More... | |
int | adcValue () |
Get the ADC value (0-4095) of the pin. More... | |
Public Attributes | |
Event< Pin, AnalogValueChangedEventArgs > | analogValueChanged |
Fires when the analog value (0.0-1.0) changes. More... | |
Event< Pin, AnalogVoltageChangedEventArgs > | analogVoltageChanged |
Fires when the analog voltage (0.0-3.6) changes. More... | |
Event< Pin, AdcValueChangedEventArgs > | adcValueChanged |
Fires when the ADC value (0-4091) changes. More... | |
Event< DigitalIn, PinChangedEventArgs > | digitalValueChanged |
Fires whenever the digital input changes. More... | |
int | pinNumber |
Gets the pin number of the pin. More... | |
Spi * | spiModule |
Gets the SPI module this pin can be used with. More... | |
Friends | |
class | TreehopperUsb |
Once you have connected to a TreehopperUsb board, you can access pins through the pins collection on the board.
You can manipulate pins directly:
Or create reference variables:
You can choose whether a pin should be a digital input, digital output, analog input, or soft-PWM output by calling the pin's mode() property to one of the values in PinMode.
You can set or retrieve the digital value of a pin by accessing the digitalValue() property. Note that setting this property — even if the pin is an input — will implicitly force it to be an output.
If the pin is set as an analog input, you can access its data through any of the following properties:
This section dives into more details and electrical characteristics about Treehopper's pins.
You can choose whether a pin should be a digital input, output, or analog input by setting the pin's mode() property.
All pins on Treehopper support both push-pull and open-drain outputs. Writing a true or false to the pin's digital value will flush that value to the pin.
Treehopper's output impedance varies, but is roughly 100 ohm source and 50 ohm sink when supplying weaker loads, but increases as the load increases. In the worst-case scenario (when short-circuited), Treehopper can source approximately 20 mA of current, and sink approximately 40 mA of current. The pin's drivers are rated for a maximum of 100 mA of output current, so you cannot damage the board by short-circuiting its output to ground or 3.3V.
While this is plenty of current for peripheral ICs and small indicator LEDs, do not expect to drive large arrays of LEDs, or low-impedance loads like motors, solenoids, or speakers directly from Treehopper's pins. There are a wide variety of peripherals in the Treehopper::Libraries package for your language API that can be used for interfacing with these peripherals.
Treehopper's digital inputs are used to sample digital signals — i.e., signals that have either a LOW or HIGH state. Logic LOW (false) is considered a voltage less than or equal to 0.6V. Logic HIGH (true) is considered a voltage greater than or equal to 2.7V.
Treehopper pins are true 5V-tolerant signals; consequently, you do not need any sort of logic-level conversion or series-limiting resistor when using the pin as a digital input with a 5V source.
You can access the most recent digitalValue(), or use the digitalValueChanged event to subscribe to change notifications.
Each Treehopper pin can be read using the on-board 12-bit ADC. There is no limit to the total number of analog pins activated at any time.
When the pin is sampled and sent to the host, the value is simultaneously available to the user in three forms:
There are OnChanged events associated with each of these properties:
Each pin has a configurable Treehopper::ReferenceLevel that can be used to measure the pin against. The possible reference levels are:
For most ratiometric applications — i.e., when measuring a device whose output is ratioed to its power supply — connect the sensor's power supply to the 3.3V supply pin the Treehopper and use the default 3.3V reference. The other reference options are provided for advanced scenarios that involve reading from precision voltage outputs accurately.
All of Treehopper's pins configured as digital or analog inputs are sampled continuously onboard; when any pin changes, this data is sent to the host device. When you access the digital or one of the analog value properties, you're accessing the last received data. This makes property reads instantaneous — keeping your GUI or application running responsively.
For almost all applications, changes to digital or analog inputs are to be reacted to (like with switches, interrupt outputs, encoders), or sampled (like with sensor outputs). Care must be taken, however, if you need to synchronize pin reads with other functions.
For example, consider the case where you electrically short pins 0 and 1 together on the board, and then run this code:
Each Treehopper pin can be used as a SoftPWM pin.
Writing values to (or changing pin modes of) Treehopper pins will flush to the OS's USB layer immediately, but there is no way of achieving guaranteed latency.
Occasional writes (say, on the order of every 20 ms or more) will usually flush to the port within a few hundred microseconds. If your application is chatty, or the bus you're operating on has other devices (especially isochronous devices like webcams), you may see long periods (a millisecond or more) of delay.
Analog pins take a relatively long time to sample; if you enable tons of analog inputs, the effective sampling rate will drop by up to two times.
Pin | ( | TreehopperUsb * | board, |
uint8_t | pinNumber | ||
) |
int adcValue | ( | ) |
double analogValue | ( | ) |
double analogVoltage | ( | ) |
|
overridevirtual |
Note that if the current PinMode of the pin is not a digital output (i.e. not PinMode::PushPullOutput or PinMode::OpenDrainOutput), it will be set as PinMode::PushPullOutput before writing the value to the pin.
Reimplemented from DigitalOut.
|
overridevirtual |
Reimplemented from DigitalIn.
void makeAnalogInput | ( | ) |
|
overridevirtual |
Implements DigitalIn.
|
overridevirtual |
Implements DigitalOut.
void mode | ( | PinMode | value | ) |
PinMode mode | ( | ) |
void referenceLevel | ( | AdcReferenceLevel | value | ) |
AdcReferenceLevel referenceLevel | ( | ) |
void toggleOutput | ( | ) |
Note that since digitalValue(bool) is ultimately called, if the current PinMode of the pin is not a digital output, it will automatically become a PinMode::PushPullOutput
|
friend |
Event<Pin, AdcValueChangedEventArgs> adcValueChanged |
Event<Pin, AnalogValueChangedEventArgs> analogValueChanged |
Event<Pin, AnalogVoltageChangedEventArgs> analogVoltageChanged |
|
inherited |
|
inherited |
|
inherited |