ページ移動

エントリー

2018年03月の記事は以下のとおりです。

Microsoftは終わったか

空き容量不足でWindows10の更新ができないのが2機種ある(1つはコレのこと)

「PCの空きディスク領域を増やして下さい(必要な領域は8GB)」

と表示され(現状はネットで調べても)回避手段がない

Cドライブを8GB空けないとどうしようもないようなのでCドライブを検査してみるとWindowフォルダがなんと24GBも使用している

どうなったら24GBも使うのだろう?

かつて1GBもないディスクドライブからWindowsを使っている者からみれば考えられないような消費に思える

とにかく更新期限が迫っているのでどうにかしたいものだ

・・・

現在のPCはハイエンドやエキスパートとしてデスクトップがあり,その他大勢はタブレット型に近いノートPCである

そしてその大勢がようやくPCを使えるようになったわけであるのだがWindowsはまったく対応する気がないってことはMicrosoftは終わりと考えて良さそう

今後のハードウェアの調達方向性に関して重要な事であるため見過ごす訳にはいかない

・・・

ところでPCの行く先はどうなのか?

どんどん小型化され高速化と進むことは確かと思うが,人が手で使えるサイズは現在の時計レベルであると考えるし,情報として画面で認識できるサイズはもう少し大きい

このあたりのサイズが大衆の中心となるPCとなり前後のサイズが個性的な物に使用されるようになるのではないだろうか

それとも人が手で使うことがないとか画面を観ないとかに進化していくのか

(追加:2018.3.18)

1台のみであるがCドライブを「システムファイルのクリーンアップ(ディスクのプロパティからディスクのクリーンアップを実行すると表示される)」でぎりぎり8GBであったが空いたので更新プログラムを終了できた

(追加:2018.3.19)

完了したと思っていたら何故か終わってなかった

エラーは発生していないし何が起きたのか?

仕方ないので再度更新プログラム実行中

(追加:2018.3.20)

ほとんど丸一日の24時間電源入れっぱなしで仕事から帰宅したら以下の画面になっていた

update01.png

今度こそは終わったか・・・更新アシスタントを再度実行すると

update02.png

本当に終わったかも・・・一応バージョン確認を

update03.png

大丈夫そうだ

ディスクが32GBでは厳しいことになるわけで安価でも購入は控えた方が良さそうだ

尚,もう1台の16GBタブレットの更新は無理そうだ

太陽無人探査機「パーカー・ソーラー・プローブ」に搭乗

  • 2018/03/14 21:45
  • カテゴリー:未分類

無人なのに搭乗とは・・・

実は搭乗できるのは名前だけで,現在NASAのサイトで募集している(CNNNASA登録サイト

さっそく登録した

太陽無人探査機搭乗.png

最後は太陽に飲み込まれるのかな?となると,太陽に(電子データだけど)名前を刻むことになる

DSO138に付けたロータリエンコーダ

DSO138に付けたロータリエンコーダ・・・使えない訳でではないのだが早く回すと今一つの動作なのは感じていた

そこでロータリエンコーダ制御プログラムの修正を行うことにした

//DSO138改造
//ロータリエンコーダを取り付け V1.40
//
// ロータリエンコーダの回転を割込みで処理
// A・B軸割込みを全て受けて前回と今回でインデックス処理し回転カウントを蓄積
// メインループでは蓄積された量によってボタンをエミュレートする回数を決める
// 蓄積が少ない多いでロータリエンコーダの回転速度を判定し
// 初回をある程度の回数をボタン1回とし残りはボタン1回とする数を変動する
// 現在は2段階にしている
//
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>

#define EN_A PB0
#define EN_B PB1
#define OUT1 PB2
#define OUT2 PB3

#define BTNON_TIME_US   (20000)   //ボタンON時間
#define BTNOFF_TIME_US  (10000)   //ボタンOFF時間
#define RT_FIRST_COUNT  (3)       //初回回転カウント数(クリック付きでは1クリック4なので4以下が望ましい)
#define RT_NEXT_COUNT   (2)       //初回以降の回転カウント数

//回転方向テーブル
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
// 0 + - 0 - 0 0 + + 0 0 - 0 - + 0
// 0: 静止,無効,+: 右,-: 左
static const int dir[] = { 0, 1, -1, 0, -1, 0, 0, 1, 1, 0, 0, -1, 0, -1, 1, 0 };
static int count = 0;
static int prev = 0;

//ロータリー動作割込み:前回値と今回値でインデックスを作り回転方向を蓄積
ISR(PCINT0_vect) {
int current = (PINB&0x03);
if(prev != current) { //チャタリング対応
int index = ((prev<<2) + current) & 0x0f;
count += dir[index];
prev = current;
}
}

void setup() {
//内蔵のプルアップ抵抗を有効にする場合は、DDRxで該当のピンを入力にした後
//そのピンをHIGHに設定する(有効にしない場合はLOWに設定する)
DDRB = (_BV(OUT1)|_BV(OUT2)); //pinMode(OUT1, OUTPUT); pinMode(OUT2, OUTPUT);
PORTB |= _BV(EN_A); //pinMode(EN_A, INPUT_PULLUP);
PORTB |= _BV(EN_B); //pinMode(EN_B, INPUT_PULLUP);
PORTB |= _BV(OUT1); //digitalWrite(OUT1, HIGH);
PORTB |= _BV(OUT2); //digitalWrite(OUT2, HIGH);

GIMSK |= (1<<PCIE); //PCINT割込みを有効
PCMSK = _BV(EN_A) | _BV(EN_B); //割込み許可ポートの設定
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}

void loop() {
int dt;
boolean cont_flg = false; //連続中フラグ
int cont_cnt = 0; //連続中の前回残りカウント

for(;;) {
cli(); //割り込み禁止
dt = count;
count = 0;
sei(); //割り込み許可

if(dt == 0) {
//今回カウントが0なら回転を止めたと判断
//残りもリセットしてスリープ,残りカウントはクリアしないほうが良さそう
cont_flg = false;
// cont_cnt = 0;
sleep_mode();
} else {
dt += cont_cnt;
if(cont_flg) {
//継続
if(dt > 0) {
//右回転(+)
while(dt >= RT_NEXT_COUNT) {
PORTB &= ~_BV(OUT1); //digitalWrite(OUT1, LOW);
_delay_us(BTNON_TIME_US);
PORTB |= _BV(OUT1); //digitalWrite(OUT1, HIGH);
_delay_us(BTNOFF_TIME_US);
dt -= RT_NEXT_COUNT;
}
} else {
//左回転(-)
while(dt + RT_NEXT_COUNT <= 0) {
PORTB &= ~_BV(OUT2); //digitalWrite(OUT2, LOW);
_delay_us(BTNON_TIME_US);
PORTB |= _BV(OUT2); //digitalWrite(OUT2, HIGH);
_delay_us(BTNOFF_TIME_US);
dt += RT_NEXT_COUNT;
}
}
cont_cnt = dt;
} else {
//初回
//クリック1回分のカウントがあれば実行
if(dt >= RT_FIRST_COUNT) {
//右回転(+)
PORTB &= ~_BV(OUT1); //digitalWrite(OUT1, LOW);
_delay_us(BTNON_TIME_US);
PORTB |= _BV(OUT1); //digitalWrite(OUT1, HIGH);
_delay_us(BTNOFF_TIME_US);
cont_cnt = dt - RT_FIRST_COUNT;
cont_flg = true;
} else if(dt + RT_FIRST_COUNT <= 0) {
//左回転(-)
PORTB &= ~_BV(OUT2); //digitalWrite(OUT2, LOW);
_delay_us(BTNON_TIME_US);
PORTB |= _BV(OUT2); //digitalWrite(OUT2, HIGH);
_delay_us(BTNOFF_TIME_US);
cont_cnt = dt + RT_FIRST_COUNT;
cont_flg = true;
} else {
cont_cnt = dt;
}
}
}
}
}

使用しているロータリエンコーダはクリック付きの物であり1クリックで4回のカウントが出るので単純に4回を1回として数えるだけとかクリックを無視して全カウントを数えるとか試行してみたが操作性が良くならなかった

ロータリエンコーダの動作を得てもボタンのエミュレート処理の方で遅延が発生するためリアルタイムに処理できないためである

テストプラグラムでは右回転だけしていてもチャタリングや高速回転で処理が追い付かない場合もあるのか左回転と判断してしまう事もあることが判っている

そこで最終的に回転結果をQue化にすることにした

Queといっても1つずつ取り出して処理する必要はないので回転数をカウントしておくカウンタであり溜まったカウンタの数から回転速度を想定しボタンエミュレートする

今回は2段階速度の判定で操作性が十分になった

最後に

プログラムは難しいものでないので速攻で出来た・・・のだけど・・・実は思うように動作しないバグがあって情けないことに解決まで3時間位掛かった

デバッグコードが埋め込めないので動作予想できる範囲でコードをコメントアウトしながらデバッグした結果

以下が問題だったことがやっとこさ判る

static const byte dir[] = { 0, 1, -1, 0, -1, 0, 0, 1, 1, 0, 0, -1, 0, -1, 1, 0 };

サイン付きデータなのにサイン無しのbyteになっていたのである

書き換え前はサイン無しデータ(元は-1は2)だったので変更するのを忘れてしまっていた

しかしこれはコンパイラでwarning出して欲しい(それともメッセージ設定があって設定するのをミスってるのかな?)

ページ移動

  • ページ
  • 1
  • 2

ユーティリティ

検索

エントリー検索フォーム
キーワード

新着コメント

過去ログ

Feed