The Pocket Science Lab multimeter has got three channels namely CH1,CH2 and CH3 with different ranges for measuring the voltages, but there was a channel communication error occuring at CH1 and CH2 pins of PSLab. This blogs will give a brief description of the channel communication error and how was it solved by me.
In the previous blog I have discussed about the channel communication of PSLab and how it works. In this blog i will be discussing about the channel communication error which was occuring while using CH1 and CH2 pins of PSLab android.
Communication between PSLab device and Android App
As discussed in the previous blog the communication between the PSLab and the android occurs with the help of the USBManger class of android.
One of the major function which makes it possible is the bulk transfer function of the android
amtWritten = mConnection.bulkTransfer(mWriteEndpoint, src, written, writeLength, timeoutMillis);
As shown in the above code, there is a timeout that some time required for this function to be executed, and otherwise this function will return a negative value which will mean that the communication is not successful.
Voltage Measuring Functions
The main function which gets called while pressing the button for measuring voltage is the getVoltage function which simultaneously calls the volmeterAutoRange function as well as the getAverage voltage function. The voltageAutoRnge function also calls the getAverage function inside of it.
public double getVoltage(String channelName, Integer sample) {
this.voltmeterAutoRange(channelName);
double Voltage = this.getAverageVoltage(channelName, sample);
if (channelName.equals("CH3")) {
return Voltage;
} else {
return 2 * Voltage;
}
}
Calling both these functions simultaneously results in calling of the bulktranfer method
VoltmeterAutoRange function:-
private double voltmeterAutoRange(String channelName) {
if (this.analogInputSources.get(channelName).gainPGA == 0)
return 0;
this.setGain(channelName, 0, true);
double V = this.getAverageVoltage(channelName, null);
return this.autoSelectRange(channelName, V);
}
The getAverage voltage function calls the getRawableVoltage function which thus calls the USBManger class functions of read and write, thus calling the bulkTranfer function.
Thus as the bulk transfer function is called simultaneously it caused problem in communication.
Solving the issue
The communication related  issues were finally solved when these bugs were spotted, the solution to this issue is that the voltageAutoRange function’s return value was never used in the codes and was thus not required.[2]The voltageAutoRange function was calling the getAverageVoltage function just to get a return value. Thus I formatted the function and now it looks like this-
private void voltmeterAutoRange(String channelName) {
if (this.analogInputSources.get(channelName).gainPGA != 0) {
this.setGain(channelName, 0, true);
}
}
And thus finally the issue was solved and all things were working fine in channel communication.
Resources
-
-
-
- How to establish communication between android device and usb, coderanch.com
https://coderanch.com/t/622740/establish-communication-android-device-usb - Android bulkTransfer return -1, StackOverflow
https://stackoverflow.com/questions/15963402/bulktransfer-returns-1 - Pull request #1066, Solve communication issues in CH1 and CH2
https://github.com/fossasia/pslab-android/pull/1066
- How to establish communication between android device and usb, coderanch.com
-
-