-
Notifications
You must be signed in to change notification settings - Fork 0
/
Android_things.txt
232 lines (196 loc) · 8.76 KB
/
Android_things.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
1、 list of available GPIO ports:
PeripheralManagerService service = new PeripheralManagerService();
Log.d(TAG,"Available GPIO: " + service.getGpioList());
2、 Handle button events
To receive events when a button connected to GPIO is pressed:
① Use PeripheralManagerService to open a connection with the GPIO port wired to the button.
② Configure the port with DIRECTION_IN.
③ Configure which state transitions will generate callback events with setEdgeTriggerType().
④ Register a GpioCallback to receive edge trigger events.
⑤ Return true within onGpioEdge() to continue receiving future edge trigger events.
⑥ When the application no longer needs the GPIO connection, close the Gpio resource.
public class ButtonActivity extends Activity {
private static final String TAG = "ButtonActivity";
private static final String BUTTON_PIN_NAME = ...; // GPIO port wired to the button
private Gpio mButtonGpio;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PeripheralManagerService service = new PeripheralManagerService();
try {
// Step 1. Create GPIO connection.
mButtonGpio = service.openGpio(BUTTON_PIN_NAME);
// Step 2. Configure as an input.
mButtonGpio.setDirection(Gpio.DIRECTION_IN);
// Step 3. Enable edge trigger events.
mButtonGpio.setEdgeTriggerType(Gpio.EDGE_FALLING);
// Step 4. Register an event callback.
mButtonGpio.registerGpioCallback(mCallback);
} catch (IOException e) {
Log.e(TAG, "Error on PeripheralIO API", e);
}
}
// Step 5. Register an event callback.
private GpioCallback mCallback = new GpioCallback() {
@Override
public boolean onGpioEdge(Gpio gpio) {
Log.i(TAG, "GPIO changed, button pressed");
// Step 5. Return true to keep callback active.
return true;
}
};
@Override
protected void onDestroy() {
super.onDestroy();
// Step 6. Close the resource
if (mButtonGpio != null) {
mButtonGpio.unregisterGpioCallback(mCallback);
try {
mButtonGpio.close();
} catch (IOException e) {
Log.e(TAG, "Error on PeripheralIO API", e);
}
}
}
}
3、Blink an LED
To execute a blinking pattern on an LED connected to GPIO:
① Use PeripheralManagerService to open a connection with the GPIO port wired to the LED.
② Configure the port with DIRECTION_OUT_INITIALLY_LOW.
③ Toggle the state of the LED by passing the inverse of getValue() to the setValue() method.
④ Use a Handler to schedule an event to toggle the GPIO again after a short delay.
⑤ When the application no longer needs the GPIO connection, close the Gpio resource.
public class BlinkActivity extends Activity {
private static final String TAG = "BlinkActivity";
private static final int INTERVAL_BETWEEN_BLINKS_MS = 1000;
private static final String LED_PIN_NAME = ...; // GPIO port wired to the LED
private Handler mHandler = new Handler();
private Gpio mLedGpio;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Step 1. Create GPIO connection.
PeripheralManagerService service = new PeripheralManagerService();
try {
mLedGpio = service.openGpio(LED_PIN_NAME);
// Step 2. Configure as an output.
mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
// Step 4. Repeat using a handler.
mHandler.post(mBlinkRunnable);
} catch (IOException e) {
Log.e(TAG, "Error on PeripheralIO API", e);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
// Step 4. Remove handler events on close.
mHandler.removeCallbacks(mBlinkRunnable);
// Step 5. Close the resource.
if (mLedGpio != null) {
try {
mLedGpio.close();
} catch (IOException e) {
Log.e(TAG, "Error on PeripheralIO API", e);
}
}
}
private Runnable mBlinkRunnable = new Runnable() {
@Override
public void run() {
// Exit if the GPIO is already closed
if (mLedGpio == null) {
return;
}
try {
// Step 3. Toggle the LED state
mLedGpio.setValue(!mLedGpio.getValue());
// Step 4. Schedule another event after delay.
mHandler.postDelayed(mBlinkRunnable, INTERVAL_BETWEEN_BLINKS_MS);
} catch (IOException e) {
Log.e(TAG, "Error on PeripheralIO API", e);
}
}
};
}
4、Reading from an input
To read a GPIO port as an input:
① Configure it as an input using setDirection() with the mode DIRECTION_IN.
② Configure either a high (near IOREF) or low (near zero) voltage signal to be returned as true (active), by calling setActiveType() with ACTIVE_HIGH or ACTIVE_LOW.
Access the current state with the getValue() method.
③ The following code shows you how to set up an input with an active state associated with a high voltage level:
public void configureInput(Gpio gpio) throws IOException {
// Initialize the pin as an input
gpio.setDirection(Gpio.DIRECTION_IN);
// High voltage is considered active
gpio.setActiveType(Gpio.ACTIVE_HIGH);
...
// Read the active high pin state
if (gpio.getValue()) {
// Pin is HIGH
} else {
// Pin is LOW
}
}
5、Writing to an output
To programmatically control the state of a GPIO port:
① Configure it as an output using setDirection() with the mode DIRECTION_OUT_INITIALLY_HIGH or DIRECTION_OUT_INITIALLY_LOW. These modes ensure that the port's initial state is also set correctly at configuration time.
② Configure either a high (near IOREF) or low (near zero) voltage signal to be returned as true (active), by calling setActiveType() with ACTIVE_HIGH or ACTIVE_LOW.
Set the current state with the setValue() method.
③ The following code shows you how to set up an output to initially be high, then toggle its state to low using the setValue() method:
public void configureOutput(Gpio gpio) throws IOException {
// Initialize the pin as a high output
gpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_HIGH);
// Low voltage is considered active
gpio.setActiveType(Gpio.ACTIVE_LOW);
...
// Toggle the value to be LOW
gpio.setValue(true);
}
6、PWM
Managing the connection
In order to open a connection to a PWM port, you need to know the unique port name. During the initial stages of development, or when porting an app to new hardware, it's helpful to discover all the available port names from PeripheralManagerService using getPwmList():
PeripheralManagerService manager = new PeripheralManagerService();
List<String> portList = manager.getPwmList();
if (portList.isEmpty()) {
Log.i(TAG, "No PWM port available on this device.");
} else {
Log.i(TAG, "List of available ports: " + portList);
}
Once you know the target name, use PeripheralManagerService to connect to that port. When you are done communicating with the PWM port, close the connection to free up resources. Additionally, you cannot open a new connection to the port until the existing connection is closed. To close the connection, use the port's close() method.
public class HomeActivity extends Activity {
// PWM Name
private static final String PWM_NAME = ...;
private Pwm mPwm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Attempt to access the PWM port
try {
mPwm = mPeripheralManager.openPwm(PWM_NAME);
} catch (IOException e) {
Log.w(TAG, "Unable to access PWM", e);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mPwm != null) {
try {
mPwm.close();
mPwm = null;
} catch (IOException e) {
Log.w(TAG, "Unable to close PWM", e);
}
}
}
}
Configuring and controlling the PWM signal
After making a connection, configure the timing parameters for the PWM signal. You must set these parameters before activating the signal the first time. To activate the PWM signal, call setEnabled(true). If you need to temporarily de-activate the signal, you can call setEnabled(false).
The following example configures the PWM to cycle at 120Hz (period of 8.33ms) with a duty of 25% (on-time of 2.08ms every cycle):
public void initializePwm(Pwm pwm) throws IOException {
pwm.setPwmFrequencyHz(120);
pwm.setPwmDutyCycle(25);
// Enable the PWM signal
pwm.setEnabled(true);
}