2018 3日目 Heavenly

アメリカスキー生活3日目です。

天気とか道路状況とか

1週間以内に降雪はあったものの路面に雪はまったくなし。余裕で走れます。

Heavenly

3日目はHeavenlyにしました。その理由は、 - EPIC Passが使えること - ようやくHeavenlyもオープン率があがってきたこと - 整地されたスキー場といえばHeavenlyだと聞いていたこと

スキーでやりたいこと

いつもと同じですが、私の趣向は整地をカービングターンすること。安心してスピードを出せること。スリルはまったく求めていませんが、スピード狂かもしれません。こういう視点で感想を書いています。

リフト券はどうやって確認されるか?

Kirkwoodと同じ、野球のピッチャーが投げた球の速さを測るスピードガンみたいなものを持った人がリフト乗り場に立っていてスキャンしてくれる。ポケットの中でも大丈夫。チェックされたのは一番下のリフトだけだった。入場券の確認みたいなもの。

Heavenlyのゲレンデの状況

メモってなかったけど50%以上はオープンしていた感じ。たぶんHeavenlyの魅力ってネバダ側の左側、コースじゃないけどご自由にどうぞ部分なんだと思う。ここがクローズしているから全体的なオープン率は低く見えるけど、整地を滑りたい人にはこの部分は無関係。カリフォルニア側はHIGH FIVEは開いているけど不整地。LIZ'Sはクローズ。POWDERBOWLもクローズ。ネバダ側はGALAXYエリアが全クローズ。

カービング向きのコース

気持ちよくカービングできるのは、DIPPER EXPRESSから右に出てORIONとORINPIC EXPRESSでOLYMPIC DOWNHILLの2箇所。とても気持ちがいい。BIG DIPPERはあまり平らじゃないのと日陰のせいか見づらくてやや怖い。

カリフォルニア側

Lake Tahoeの眺めが良いのはカリフォルニア側。もっとも標高が高い場所まで行けるSKY EXPRESSで3,060mまであがってRIDGE RUNをおりてくると眺めは良いけど、斜面としてはあんまり。LIZ'SやHIGH FIVEが整地ならもっと楽しめるのかもしれないけど、RIDGE RUNしかないカリフォルニア側はあまり行く価値なし。ネバダ側に戻るSKYLINE TRAILもただ移動するって感じ。雪質がいまいち。

ネバダ

景色はおもにネバダ側になる。茶色い荒野。雪質はあきらかにネバダ側のほうが良い。上にも書いたけどORIONとOLYMPIK DOWNHILLがカービング向き。最高。OLYMPIC DOWNHILLに行くのが難しかったけど、COMET EXPRESSに上がると矢印にしたがって行ける。ここからくだればStagecoachまで滑って降りれる。

駐車場

Stagecoach lodge, Boulder lodge, California lodgeの3箇所は無料駐車場。だんぜんネバダ側が滑りやすいのとEXPRESSリフトなStagecoachがいちばんオススメ。8:15くらいについたらほぼガラガラだった。

有料のSouth Lake Tahoe Public Parkingに停めると、ゴンドラであがれると思われるけど、下りコースが見当たらないからゴンドラで降りてくるんだと思う。観光ガイドブックにのってたけどこのゴンドラはとても眺めが良いみたい。ここに停めればヘブンリービレッジでレストランにいったりもできる。街中はValletパーキングが多くて、アメリカ人としゃべったり車を預けたりするのが苦手なら停めにくい。

まとめ

今まで行った3箇所でランキングをつけるのは難しいけど、Heavenlyのほうが見通しが良くてカービングで飛ばしている人が多かったかも。ただ、公式Twitterでもしょっちゅう出ている通り、とにかくWindholdが多い。すぐ風で止まる。リフトの安全バーにコースマップがあることが多いのはNorthstarと似ている。Northstarは本当に風に強い。SquawもHeavenlyもSugarbowlも風で全面閉鎖していた日も普通に営業していた。行きやすさはI80から近いNorthstarかなぁ。

前売りチケットの価格6

カリフォルニア州でスキーをするために必須となる前売りチケットの価格調査です。

チケット 10/7 10/11 11/22 12/8 12/20 12/27
EPIC 4day $479 $489 $489 N/A N/A N/A
EPIC 7day $689 $709 $709 N/A N/A N/A
EPIC Tahoe local $589 $609 $609 N/A N/A N/A
EPIC Tahoe value $499 $519 %519 N/A N/A N/A
EPIC $929 $949 $949 N/A N/A N/A
Tahoe Super 4 $369 $369 $389 $409 $409 $439
Sugar Bowl unrestricted $799 $799 $829 $829 $829 $879
Sugar Bowl slightly restriced $589 $589 $619 $619 $619 $639
IKON PASS $999 $1049 $1049 $1049 N/A N/A
IKON BASE PASS $699 $749 $749 $749 N/A N/A

前売りチケットの価格5

カリフォルニア州でスキーをするために必須となる前売りチケットの価格調査です。

IKON Passも発売が終了していました。もう買えません。日付を指定して普通に買うしかありません。 ちなみにTahoe Super 4の次回値上げは12/22です。

チケット 10/7 10/11 11/22 12/8 12/20
EPIC 4day $479 $489 $489 N/A N/A
EPIC 7day $689 $709 $709 N/A N/A
EPIC Tahoe local $589 $609 $609 N/A N/A
EPIC Tahoe value $499 $519 %519 N/A N/A
EPIC $929 $949 $949 N/A N/A
Tahoe Super 4 $369 $369 $389 $409 $409
Sugar Bowl unrestricted $799 $799 $829 $829 $829
Sugar Bowl slightly restriced $589 $589 $619 $619 $619
IKON PASS $999 $1049 $1049 $1049 N/A
IKON BASE PASS $699 $749 $749 $749 N/A

2018 2日目 Northstar

土日で行ったので、アメリカスキー生活2日目です。

天気とか道路状況とか

昨日と同じ。むしろあったかいかも。

Northstar

2日目はNorthstarにしました。その理由は、 - EPIC Passが使えること - Heavenlyよりオープン率が高いこと です。本当はHeavenlyが近かったから行きたかったよ。。

スキーでやりたいこと

昨日と同じですが、私の趣向は整地をカービングターンすること。安心してスピードを出せること。スリルはまったく求めていませんが、スピード狂かもしれません。こういう視点で感想を書いています。

リフト券はどうやって確認されるか?

Kirkwoodと同じ、野球のピッチャーが投げた球の速さを測るスピードガンみたいなものを持った人がリフト乗り場に立っていてスキャンしてくれる。ポケットの中でも大丈夫。

Northstarのゲレンデの状況

リフトは11/20, トレイルは75/100のオープン率ながら、庶民な自分にとってはだいたいどこでも滑れる、という状況。ただし、いちばん左端、VISTA EXPRESSから左に下りるLOGGER'S LOOPは、レースの準備中とかなんとかで入れませんでした。初級者の方はこのリフトをメインに、SKID TRAIL, LUMBERJACKと降りてくるのは問題なく楽しめそうです。途中ちょっとだけ急に感じるかもしれないけど。さらに上、COMSTOCK EXPRESSで上がって左に下りるEAST RIDGEは、色は青で中級ということになっていますが、斜度はほぼなく初心者でも滑れそうでした。ただし、SKID TRAILに回り込むところはやや急だったかも。

右側はThe Backsideということで、ほぼ上級コースだらけになっていますが、WEST RIDGE - DRIFTERと降りてくる中級ルートとBUROUTは整地してあって、カービングが楽しめます。特にBURNOUTは上級ということで斜度はきつめですが、見通しが良いこともあって午前中の路面が荒れていない間はスピードを楽しめると思います。BACKSIDE EXPRESSは空いています。待ち時間は常に0minでした。

右下、Martis Campはここに泊まっている人限定エリアなのでしょうか。行き方すらわかりませんでした。

最初にBIG SPRING EXPRESS GONDOLAであがりましたが、ここはVILLAGE RUNという初級コースで降りて来れます。初級者はここで滑るのも良いかもしれません。

駐車場

ナビに従って行けば、看板が出てきます。Free parkingの看板にしたがって進めば迷わないでしょう。歩いてはいけないけど、無料シャトルバスがけっこうしょっちゅう出ています。止めたエリアがKとかJとか、YellowとかRedとかあるはずなので忘れないように。帰れなくなります。 帰りのバスはそこまで頻繁ではなさそうだったけど、まあそれなりに出ている感じ。10~15分に1本って感じかな。すべてのバス停に止まるみたいなので、乗ったところで降りれば良いと思います。

歩いていける距離の有料駐車場もありそうでした。価格は未確認。

まとめ

Kirkwoodより断然に良かった。高速リフトも豊富。リフトの安全バーにコースマップが書いてあるから、リフトにのるたびに次はどこに行こう?って考えられるのも便利。昨日の疲労がなければBURNOUTをもっと滑りまくったと思う。雪不足感はあって閉鎖されてたり草とか石とか出てたりして、板の裏に大きい傷がざっくり入ったのは残念。

2018初滑り Krikwood

今シーズン初すべり、アメリカ初すべり、ついに海外デビューしてきました。

天気とか道路状況とか

ここ最近はぜんぜん雪は降っていませんでした。なんならSan Joseエリアの最高気温は70度台だったりして、まったくスキー日和ではない感じ。道路もまったく何も無く、安心して制限速度50mphで走れました。ただ、日が暮れてから到着したので、真っ暗さに不安たっぷりでした。

選んだのはKirkwood

初すべりはKriwkwoodにしました。その理由は、 - EPIC Passが使えること - 100%オープンしていたこと です。気合を入れてEPIC Passを購入していたので、初すべりはこれが使える場所で、と思っていました。本当はHeavenlyにしたかったんですが、コースのオープン状況がまったくもってすばらしくなく、このリフトは動いてて、このコースは整地されてて、だからこういってこういって、みたいな悩みをかかえていましたが、一方Kirkwoodは100%オープンということで、なんの悩みも無く、動いているリフトにのってただすべれば良いだけ。Krikwoodにしました。

スキーでやりたいこと

スキーヤーは、モーグルとか深雪とかいろいろやりたいことが違うと思いますが、私の趣向は整地をカービングターンすること。安心してスピードを出せること。スリルはまったく求めていませんが、スピード狂かもしれません。こういう視点で感想を書いています。

リフト券はどうやって確認されるか?

野球のピッチャーが投げた球の速さを測るスピードガンみたいなものを持った人がリフト乗り場に立っていてスキャンしてくれます。EPIC 4-dayの場合はポケットに入っていても大丈夫で、40cmぐらい離れていても読めていそうな感じでした。左端のほうのリフト、SUNRISEとかIRON HORSEではスキャンする人はいませんでした。こんなところにたどり着いた人はリフト券持っているでしょう、ということなんでしょうね。

Kirkwoodのゲレンデの状況

分かりやすいところからいくと、右端のTIMBER CREEK BASE AREAは完全に初心者向け。初級ではないですよ、初心者向け。BUNNYというリフトは、小さいお子さん連れの人が乗るときはリフトを止めてくれます。なんて優しいの。斜面はほんとうに緩斜面。平らなんじゃないか、っていうくらいの緩斜面。初心者にぴったり。となりのTC EXPRESSのほうは、中級コースという表示になっているものの、他の中級コースとくらべるとかなり初級な感じ。EXPRESSとついているリフトは乗り降りするときに本流からはずれてゆっくりになるやつなので、速度も速くて初級者にはとても良いのではないでしょうか。

続いて、まんなかのMOUNTAIN VILLAGEエリア。CORNICE EXPRESSが高速リフトですが、山頂までいってしまって、上級コースを通らないと降りれなくなります。SOLITUDEのほうも中級コースしかないですし、この中級はさっきの中級とは比較にならないくらい斜度がきついです。初級者は乗らないほうが良いかも。個人的にはMOKELUMNEが良かったです。このリフトをおりて右にいくと、せまい急斜面をおりることになって、そこから先は緩斜面、という感じで、あまり楽しめませんでした。

少し左側のTHE REUTとTHE WALL。WALLのほうはWALLというコースに行く人用のリフト。ダブルダイヤモンドなので上上級コース。カービングした人は行くべきではありません。THE REUTのほうは、リフトを降りて右側の平らなところをぐるっとまわるとBUCKBOARDという中級コースに出れます。これはカービングに向いてました。THE REUT乗り場のすぐ上には、斜度がゆるいモーグルコースみたいなのもあります。ゆるめの斜面でコブ練習したい人には良いですね。

もっと左側のSNOWKIRK。これに乗るとさらに左側にいけますね。このリフトを出て左側にあるはずのLOW WHISKEYは見通しがよくてカービングにむいていましたが、このリフトからの行き方がわからず。。さらにCAPLES CRESTに乗り継いでさらに左側にいけます。

いちばん左側、ここはSUNRISEとIRON HORSRがあります。IRON HORSEのほうがカービング向きでした。

駐車場

たぶん、ナビにしたがっていくとTIMBER CREEK BASE AREA側から到着すると思います。初心者をつれているならここの広めの駐車場にとめるのもありでしょうね。さらに進んでMOUNTAIN VILLAGE手前の駐車場は、朝8時半時点でいっぱいでした。THE REUTのあたりには有料$25の駐車場があります。お金で近さを買うならここですね。8時半ではガラガラでした。もう少し奥まで行くと駐車場があります。ここは余裕でとめられました。リフトまでは徒歩5~10分というところでしょうか。

まとめ

見通しがよくて、斜度が安定していて、整地されていて、安心してスピードを出せる場所が好きですが、Kirkwoodはそんな感じではないようです。たぶん、深雪大好きなエクストリームな人が、雪が降った直後に行ってほわっほわの深雪を楽しむというのがKirkwoodの楽しみ方なのでしょう。

事前情報ではリフトが古めということでしたけど、乗降時に減速するタイプは2基だけ、他は日本で言う高速リフトに分類される、座るときはヒザの裏が痛いけど乗ってみると遅いというやつでした。ゴンドラがあるわけでもなく、確かに古めかもしれません。

ただ、Heavenlyが43/94しかコースが空いていない現状で100%コースが空いているというメリットは大きいです。Squawも93/175。Northstar 75/100。Sugar Bowlは92/102(ただし整地は31)。いちはやくフルオープンのスキー場で滑りたい人はKirkwood良いですね。

結論としては、カービングを楽しみたい場合はもう来ることはないでしょう。

ワイヤレスリモコンを改造しよう7

https://tomo3i.hatenablog.com/entry/2018/11/21/082245

そこそこ順調に動いてくれていたものの、たまに固まっていることに気がついた。特にログも出していないし何が問題なのかはまったくわからない。そこでとりあえずの対策としてwatchdog timerを導入することにした。

Arduinoっていろんな種類のMCUがあって、ボードによって同じコードが動いたり動かなかったりするというのは、前回HIDで学んだことだけど、watchdog timerも似たような状況っぽい。発見したソースコードコンパイルしたらエラーなく通ったのでTinyduinoでも動かしてみることにした。

#include <avr/wdt.h>

void setup ()
{
  Serial.begin (115200);
  Serial.println ("Restarted.");
  wdt_enable (WDTO_8S);  // reset after one second, if no "pat the dog" received
}  // end of setup

void loop ()
{
  Serial.println ("Entered loop ...");
  wdt_reset ();  // give me another second to do stuff (pat the dog)
  while (true) ;   // oops, went into a loop
}  // end of loop

これで、8秒後にリセットがかかるようになった。Tinyduinoはavr/wdt.hでウォッチドッグタイマーが使えます。

あと、単に点灯し続けるのはつまらないので勝手にON/OFFさせてみることにした。

unsigned long nextOnTime = 0;
unsigned long nextOffTime = 0;
unsigned long currentTime = 0;
void blinkOnOff() {
  if (lastCommand == 1) {
    currentTime = millis();

    if (currentTime > nextOnTime) {
      modulate_out(on);
      nextOffTime = currentTime + 2000;
      nextOnTime = currentTime + 3000;
    }
    if (currentTime > nextOffTime) {
      modulate_out(off);
      nextOffTime = currentTime + 10000;
    }
  }
  else {
    nextOnTime = nextOffTime = 0;
  }
}

millis()というのは50日ぐらいでオーバーフローするらしい。今のところ3日ぐらいで固まっているから問題ないことにする。ということで、ONしたら次にOFFするタイミングとONするタイミングを決めておくことにした。このタイミング情報は、本来なら決め打ちじゃなくてHTTPでもってくるJSONのパラメーターとして実装したいところだけど、とりあえずの実装としてはこれでOKということにする。

ということで、全ソースコード

/*
  Modified Repeating WiFi Web Client
  http://arduino.cc/en/Tutorial/WiFiWebClientRepeating
*/

#include <SPI.h>
#include <WiFi101.h>
#include <avr/wdt.h>

#include "arduino_secrets.h"
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0;            // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;

// Initialize the WiFi client library
WiFiClient client;

// server address:
char server[] = SECRET_SERVER;

unsigned long lastConnectionTime = 0;            // last time you connected to the server, in milliseconds
const unsigned long postingInterval = 1L * 1000L; // delay between updates, in milliseconds

#define O 4 // control signal output pin
#define SHORT 390 -20 // target - adjustment us
#define LONG  990 -10 // target - adjustment us
#define INTER 9930 -1000 // us
#define NUM 5 // repeat the same command

String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete

String on    = "0001010100010101010101110";
String off   = "0001010100010101010101000";

void short_out() {
  digitalWrite(O, HIGH);
  delayMicroseconds(SHORT);
  digitalWrite(O, LOW);
  delayMicroseconds(LONG);
}

void long_out() {
  digitalWrite(O, HIGH);
  delayMicroseconds(LONG);
  digitalWrite(O, LOW);
  delayMicroseconds(SHORT);
}

void modulate_out(String s) {
  int l = s.length();
  //Serial.println(l);
  int i, j;
  short_out();
  for (j = 0; j < NUM; j++) {
    delayMicroseconds(INTER);
    for (i = 0; i < l; i++) {
      char c = s.charAt(i);
      if (c == '0') {
        short_out();
      }
      else {
        long_out();
      }
    }
  }
}


void setup() {
  wdt_enable (WDTO_8S);  // reset after one second, if no "pat the dog" received

  //Initialize serial and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  pinMode(O, OUTPUT);
  digitalWrite(O, LOW);

  WiFi.setPins(8, 2, A3, -1);
  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present");
    // don't continue:
    while (true);
  }

  int wait = 5;
  // attempt to connect to WiFi network:
  while ( status != WL_CONNECTED) {
    wdt_reset ();
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);

    // wait 5 seconds for connection:
    delay(5000);
    wait--;
    if (wait == 0) {
      break;
    }
  }
  // you're connected now, so print out the status:
  printWiFiStatus();
}

int countDown = 0;
int checkNF = 0;
int lastCommand = 0;
int thisCommand = 0;

void checkCommand() {
  char c = client.read();
  //Serial.write(c);

  if (checkNF == 1) {
    checkNF = 0;
    if (c == 'n') { // command is on
      thisCommand = 1;
    }
    else if (c == 'f') { // command is off
      thisCommand = 0;
    }
  }
  if (countDown > 0) {
    countDown--;
    if (countDown == 0) {
      //Serial.println("check if it is o");
      if (c == 'o') {
        checkNF = 1;
      }
    }
  }
  if (c == '{') {
    //Serial.println("in JSON");
    countDown = 7;;
  }
}

void sendCommand() {
  Serial.println("command changed");
  Serial.println(thisCommand);

  if (thisCommand == 1) {
    modulate_out(on);
  }
  else {
    modulate_out(off);
  }
}

unsigned long nextOnTime = 0;
unsigned long nextOffTime = 0;
unsigned long currentTime = 0;
void blinkOnOff() {
  if (lastCommand == 1) {
    currentTime = millis();

    if (currentTime > nextOnTime) {
      modulate_out(on);
      nextOffTime = currentTime + 2000;
      nextOnTime = currentTime + 3000;
    }
    if (currentTime > nextOffTime) {
      modulate_out(off);
      nextOffTime = currentTime + 10000;
    }
  }
  else {
    nextOnTime = nextOffTime = 0;
  }
}

void loop() {
  wdt_reset ();

  while (client.available()) {
    checkCommand();
  }

  if (lastCommand != thisCommand) {
    sendCommand();
    lastCommand = thisCommand;
  }
  blinkOnOff();

  // if postingInterval seconds have passed since your last connection,
  // then connect again and send data:
  if (millis() - lastConnectionTime > postingInterval) {
    httpRequest();
  }

}

// this method makes a HTTP connection to the server:
void httpRequest() {
  // close any connection before send a new request.
  // This will free the socket on the WiFi shield
  client.stop();

  // if there's a successful connection:
  if (client.connect(server, 80)) {
    client.println(SECRET_HTTP_GET);
    client.println(SECRET_HTTP_HOST);
    client.println("Connection: close");
    client.println();

    // note the time that the connection was made:
    lastConnectionTime = millis();
  }
  else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
  }
}


void printWiFiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}